Smalltalk OOP和Simula OOP之间在哲学上有区别吗?
这是一个与Java&C#与C 间接相关的问题。据我了解,C 基于Simula,但是Java和C#或多或少地来自Smalltalk系列。
在更广泛的OOP标语中有几个“风格”上的关键“差异”。
在所有情况下,关于 静态 或 动态 类型系统的声明主要意味着一个或另一个,这个问题远非明确或明确定义的。同样,许多语言选择模糊选择之间的界限,因此无论如何这都不是二进制选择的列表。
或“什么foo.Bar(x)意思?”
foo.Bar(x)
1通常在错误的静态类型框架中使用,在编译时检查是否存在这样的实现。此外,如果x和y是不同类型,则语言通常会区分Bar(x)和Bar(y)。这是方法重载,并且具有相同名称的结果方法被视为完全不同。
2通常在动态语言中使用(这往往会避免方法重载),因此,在运行时foo类型的消息可能没有名为“ Bar”的消息的“ handler”,因此不同的语言会以不同的方式进行处理。
如果需要,两者都可以以相同的方式在后台实现(第二种默认情况下,Smalltalk风格的默认设置是调用一个函数,但这并不是在所有情况下都具有定义的行为)。由于前一种方法可以很容易地实现为简单的指针偏移函数调用,因此可以更轻松地使其相对较快。这并不意味着其他样式也不能快速制作,但是可能需要做更多的工作才能确保在这样做时不会损害更大的灵活性。
或“婴儿从哪里来?”
同样,静态语言倾向于1,动态语言倾向于2,尽管这绝不是要求它们简单地适应样式。
或“什么或如何?”
这绝不是二进制选择。大多数基于类的语言都允许使用抽象方法的概念(尚未实现的方法)。如果您有一个所有方法都是抽象的类(在C ++中称为纯虚函数),则该类相当于一个接口,尽管它可能也定义了一些状态(字段)。真正的接口应该没有状态(因为它 仅 定义可能的事物,而不是其发生的方式。
只有较旧的OOP语言趋向于仅依赖一种或另一种。 VB6仅在接口上,没有实现继承。 Simula使您可以声明纯虚拟类,但可以实例化它们(使用时会出现运行时错误)
或“谁是爸爸?”
这个问题引起了广泛的争论,特别是因为它是C ++的OOP实现与许多现代的静态类型语言(如c#和java之类的继任者)之间的关键区别。
或“您想对我做什么?”
通常,这不是全部或全部,它仅仅是一个默认值(最常用的OOP语言默认情况下默认为可变)。这会对语言的结构产生很大影响。许多包含OOP功能的主要功能语言会将对象默认为不可变状态。
或“所有事物都是对象吗?”
这是非常复杂的,因为像自动装箱这样的技术使一切看起来都很好,但是您会发现存在一些边界情况,在这些情况下发现了这种“编译器魔术”,并且在幕后发现了Oz众所周知的向导,从而导致了问题或错误。 。在具有默认不变性的语言中,这种情况不太可能发生,因为对象的关键方面(它们既包含方法又包含 状态 )意味着与对象相似但不太复杂的事物。
或“您认为自己是谁?”
语言设计的一个更为广泛的方面,不是一个要深入的方面,而是此决策中固有的选择影响了OOP的许多方面,如前所述。
多态后期绑定的各个方面可以取决于:
语言变得越动态,这些决策就越趋于复杂,但是相反,语言用户的投入越多,而不是语言 设计者 在决策中的投入越大。在这里举一些例子是很困难的,因为可以将静态类型的语言修改为包括动态方面(例如c#4.0)。