为什么我们可以在课堂外宣布代表?是不是反对OOP概念?

vat*_*poo 13 c# oop

根据oops fundamentels,一切都必须在课堂上.那么为什么我们允许在课堂外创建代表呢?

Eri*_*ert 37

首先,你对什么是OOP"基础"的想法并不是一个根本."面向对象"一词的发明者Alan Kay着名说:

我编写了"面向对象"这个术语,我可以告诉你我没有考虑到C++.

当然,词汇"一切都在课堂内"的想法并不是OOP的基本原则.它也不是很清楚,我是一个"类"的想法是根本,以面向对象编程; "基于类的继承"模式只是嵌入到消息传递,数据抽象和实现共享等概念的语言支持中的一种方式.

第二,你的意思是C语言设计师试图制作一种符合OOP"基本原理"的语言,这使得推车摆在了前面.相反,我们希望制作一种语言,支持大型,多样化的团队在我们的平台上协作开发可版本化,独立,互动的软件组件.OOP恰好是一种很好的方式,所以这就是我们正在做的事情.

我们当然不会试图以任何方式制作一种"纯粹的"OOP语言.如果它们支持真实的客户利益情景,我们将从任何范例中获取想法.C#中的思想来自OOP,程序编程,函数式编程,动态语言等等.

第三,你的问题在逻辑上是不一致的.你问为什么你可以在课外定义一个委托.但代表是一个班级.代表是一个非常特殊的班级; 它始终是密封的,它始终从System.MulticastDelegate继承,并且它始终具有相同的成员.但这是一堂课.我们给它特殊的语法来说明它是一种非常特殊的类.能够在类之外定义委托类是有意义的.

第四,将代表置于课堂之外是合法的最终原因是因为这样做非常方便.你认为Func<T>EventHandler应该进入的课程是什么?那个班级会是"OOP"吗?根据传统的"OOP"智慧,一个类应该通过将操作数据相关联来表示一个概念 ; 你提议的父类代表什么样的概念类,它的操作和数据是什么?Func<T>

没有这样明智的外类,也没有与"外类"相关的操作或数据Func<T>.那么为什么强迫用户定义一个无用的外部类,只是为了符合某人对"OOP"意味着什么的错误想法?

  • @vatspoo:你能发明一种没有类的面向对象语言吗?你能用一种没有类的语言编写面向对象的风格吗?是的,是的.完全可以在Scheme或JavaScript或C中以OO样式编程,尽管事实上它们都没有类. (4认同)

man*_*lds 12

实际上代表是一种类型(类).当你声明一个委托类型时,它只是一个语法糖

public delegate int PerformCalculation(int x, int y);
Run Code Online (Sandbox Code Playgroud)

委托是一种安全封装方法的类型.委托类型派生自.NET Framework中的Delegate类.

http://msdn.microsoft.com/en-us/library/ms173172%28v=vs.80%29.aspx

因此,当您在类外声明委托时,实际上是在创建一个新类型/类.然后,在类中创建委托实例.

有了这个说,就像@Mehrdad出色地指出的那样,一切都必须在一个类内并不是OOP的要求.


Meh*_*dad 5

不是面向对象编程的“基础”。

它恰好是某些语言(如 Java)中的一种语言选择。

面向对象编程只是意味着使用称为“对象”的实体对问题进行建模,这些实体具有状态行为。它没有说明你的代码应该去哪里。

事实上,你甚至可以在没有类的情况下制作“对象”。只需返回一个有闭包的委托,你就有了一个对象。

例子:

//An "adder" that adds the value you give it to its current value
Converter<int, int> MakeAdder(int addend) //"constructor"
{
    return msg =>
    {
        addend += msg;
        return addend;
    };
}

//...
var adder = MakeAdder(100); //Now I have an adder object!
for (int i = 0; i < 10; i++)
    Console.WriteLine(adder(i));
Run Code Online (Sandbox Code Playgroud)

C# 中的 lambda 是一个类,这完全不是重点。你可以用像 Scheme 这样的语言来做这样的事情,那里根本不存在诸如“类”或“对象”之类的东西,只有 lambdas。