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"意味着什么的错误想法?
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的要求.
它恰好是某些语言(如 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。
| 归档时间: |
|
| 查看次数: |
6874 次 |
| 最近记录: |