Shu*_*oUk 64
在更广泛的OOP旗帜中,'Style'的几个关键'差异'.
在所有情况下,关于静态或动态类型系统的陈述主要是指一个或另一个,问题远非明确或明确定义.此外,许多语言选择模糊选项之间的界限,因此这不是任何方式的二元选择列表.
或"什么foo.Bar(x)
意思?"
1通常在静态类型框架中使用,在这种框架中它是一个错误,在编译时检查是否存在这样的实现.此外,如果x和y是不同类型,则语言通常区分Bar(x)和Bar(y).这是方法重载,并且具有相同名称的结果方法被视为完全不同.
2通常用在动态语言中(这往往会避免方法重载),因为在运行时foo的类型对于名为"Bar"的消息没有"处理程序",不同的语言可能以不同的方式处理它.
如果需要,两者都可以在幕后以相同的方式实现(通常,第二种,Smalltalk样式的默认设置是调用一个函数,但在所有情况下都没有定义的行为).由于前一种方法可以经常容易地实现为简单的指针偏移函数调用,因此可以更容易地使其相对快速地进行.这并不意味着其他样式也不能快速制作,但可能需要做更多工作以确保在这样做时不会损害更大的灵活性.
或"婴儿从何而来?"
同样,1倾向于在静态语言中发生,2在动态中发生,尽管这绝不是一个要求,它们只是适合于风格.
或"什么或如何?"
这绝不是二元选择.大多数基于类的语言都允许抽象方法的概念(尚未实现的方法).如果你有一个所有方法都是抽象的类(在C++中称为纯虚拟),那么这个类相当于一个接口,尽管它可能也定义了一些状态(字段).一个真正的接口应该没有状态(因为它定义只什么是可能的,它不是如何发生的.
只有较旧的OOP语言往往只依赖于其中一种语言.
VB6只在接口上,没有实现继承.
Simula允许您声明纯虚拟类,但您可以实例化它们(使用时出现运行时错误)
或者"谁是爸爸?"
这个问题引起了相当大的争论,特别是因为它是C++的OOP实现和许多现代静态类型语言之间的关键区别,这些语言被认为是可能的继承者,如c#和java.
或者"你想对我做什么?"
通常这不是全部或全部,它只是一个默认值(默认情况下,最常用的OOP语言默认为可变).这会对语言的结构产生很大的影响.许多主要包含OOP功能的函数式语言都默认对象具有不可变状态.
或者"一切都是对象吗?"
这是非常复杂的,因为像原始的自动装箱这样的技术使它看起来像一切都是但你会发现存在这样的"编译器魔法"并且在幕后发现Oz的众所周知的向导导致问题或错误的几个边界情况.在具有不变性作为默认值的语言中,这种情况不太可能发生,因为对象的关键方面(它们包含方法和状态)意味着与对象类似但不太可能出现并发症的事物.
或者"你认为你是谁?"
语言设计的一个更普遍的方面,而不是一个进入这里,但这个决定固有的选择影响了前面提到的OOP的许多方面.
多态晚期绑定的各个方面可以取决于:
语言变得越动态,这些决策往往变得越复杂,但相反,语言用户的输入越多,而不是语言设计者在决策中的输入.这里给出的例子可能是一些愚蠢的东西,因为静态类型语言可能被修改为包含动态方面(如c#4.0).
我也把Java和C#放在Simula阵营:
Smalltalk是动态类型的,与你引用的其他四种语言完全不同.
Smalltalk是结构类型(别名鸭子打字),而其他四个名义上打字.
(Java和C#与Smalltalk的共同点主要是基于VM,但对编程风格的影响很小).
归档时间: |
|
查看次数: |
2988 次 |
最近记录: |