OOP的学校是什么?[已关闭]
Smalltalk OOP和Simula OOP之间有哲学上的区别吗?
这是一个与Java和C#相关的问题,C++间接地。据我所知,C++是基于Simula的,但Java和C#或多或少来自Smalltalk家族。
Smalltalk OOP和Simula OOP之间有哲学上的区别吗?
这是一个与Java和C#相关的问题,C++间接地。据我所知,C++是基于Simula的,但Java和C#或多或少来自Smalltalk家族。
在更广泛的OOP横幅中,“风格”的几个关键“差异”。
在所有情况下,关于静态或动态类型系统的陈述主要意味着一个或另一个,问题远未明确或明确定义。此外,许多语言选择模糊选择之间的界限,因此这无论如何都不是二元选择的列表。
或“这是什么意思?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,但对编程风格几乎没有影响)。