为什么我们可以在课堂外宣布代表? 是不是反对OOP概念?
根据oops fundamentels,一切都必须在课堂上。 那么为什么我们允许在课外创建委托?
首先,你对什么是OOP“基础”的想法并不是一个基本要素。 “面向对象”一词的发明者Alan Kay着名说:
我编写了“面向对象”这个术语,我可以告诉你我没有考虑到C ++。
当然,词汇“一切都在课堂内”的想法并不是OOP的基本原则。 我甚至不清楚“类”的概念是面向对象编程的基础; “基于类的inheritance”模式只是嵌入到消息传递,数据抽象和实现共享等概念的语言支持中的一种方式。
其次,你的意思是C语言设计师正试图制作一种符合OOP“基本原理”的语言,这使得推车摆在了马前。 相反,我们希望制作一种语言,支持大型,多样化的团队在我们的平台上协作开发可版本化,独立,互动的软件组件。 OOP恰好是一种很好的方式,所以这就是我们正在做的事情。
我们当然不是试图以任何方式制作一种“纯粹的”OOP语言。 如果它们支持真实的客户利益场景,我们将从任何范例中获取想法。 C#中的思想来自OOP,程序编程,函数式编程,动态语言等等。
第三,你的问题在逻辑上是不一致的。 你问为什么你可以在课外定义一个委托。 但代表是一个class级 。 代表是一个非常特殊的class级; 它始终是密封的,它始终从System.MulticastDelegateinheritance,并且它始终具有相同的成员。 但这是一堂课。 我们给它特殊的语法来说明它是一种非常特殊的类。 能够在类之外定义委托类是有意义的。
第四,将代表置于课堂之外是合法的最终原因是因为这样做非常方便。 您认为Func
或EventHandler
应该进入的类是什么? 那个class级会是“OOP”吗? 根据传统的“OOP”智慧,一个类应该通过将操作与数据相关联来表示一个概念 ; 您提议的Func
父类的概念类是什么,以及它的操作和数据是什么?
没有这样明智的外部类,并且没有与Func
的“外部类”相关联的操作或数据。 那么为什么强迫用户定义一个无用的外部类,只是为了符合某人对“OOP”意味着什么的错误想法?
实际上代表是一种类型(类)。 当你声明一个委托类型时,它只是一个语法糖
public delegate int PerformCalculation(int x, int y);
委托是一种安全封装方法的类型。 委托类型派生自.NET Framework中的Delegate类。
https://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#是一种多范式语言,而不是纯粹的面向对象语言。
我之前也想过这个,但后来我理解了它直接在命名空间内声明的原因。这是因为当你声明一个委托时,在背景中创建了一个巨大的类。
上述就是C#学习教程:为什么我们可以在课堂外宣布代表? 是不是反对OOP概念?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1030065.html