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

根据oops fundamentels,一切都必须在课堂上。 那么为什么我们允许在课外创建委托?

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

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

当然,词汇“一切都在课堂内”的想法并不是OOP的基本原则。 我甚至不清楚“类”的概念是面向对象编程的基础; “基于类的inheritance”模式只是嵌入到消息传递,数据抽象和实现共享等概念的语言支持中的一种方式。

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

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

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

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

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

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

 public delegate int PerformCalculation(int x, int y); 

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

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

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

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

不是一个OOP“基础”。

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

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

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

例:

 //An "adder" that adds the value you give it to its current value Converter 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)); 

完全不同于C#中的lambda是一个类。 你可以用像Scheme那样的语言做这样的事情,那里没有基本存在的“类”或“对象”,只有lambdas。

C#是一种多范式语言,而不是纯粹的面向对象语言。

我之前也想过这个,但后来我理解了它直接在命名空间内声明的原因。这是因为当你声明一个委托时,在背景中创建了一个巨大的类。