这引起了我昨晚的注意.
在最新的ALT.NET播客中, Scott Bellware讨论了与Ruby相反的方式,如c#,java等语言.不是真正面向对象而是选择"以类为导向"这一短语.他们用非常含糊的术语谈论这种区别,而没有详细讨论或讨论利弊.
这里有什么真正的区别,它有多重要?那么其他什么语言是"面向对象的"?这听起来很有趣,但我不想学习Ruby只是为了知道如果我缺少什么.
更新:在阅读下面的一些答案后,似乎人们普遍认为参考是鸭子打字.我不确定我理解的是,这最终会发生变化.特别是如果你已经做了松散耦合的正确tdd等等等等等等.有人能给我展示一个我可以用ruby做的奇妙事情的例子,我不能用c#做这个并且这例证了这种不同的oop方法吗?
在面向对象的语言中,对象是通过定义对象而不是类来定义的,尽管类可以为给定抽象的特定cookie切割器定义提供一些有用的模板.在面向类的语言中,例如C#,对象必须由类定义,并且这些模板通常在运行时被封装和打包并使其成为不可变的.必须在运行时之前定义对象并且对象的定义是不可变的这种任意约束不是面向对象的概念; 它是面向班级的.
这里的鸭子输入评论更多地归因于Ruby和Python 比C#更具动态性.它与OO Nature没有任何关系.
我认为Bellware的意思是在Ruby中,一切都是对象.即使是上课.类定义是对象的实例.因此,您可以在运行时向其添加/更改/删除行为.
另一个很好的例子是NULL也是一个对象.在红宝石中,一切都是一个对象.在它的整个存在中拥有如此深的OO允许一些有趣的元编程技术,例如method_missing.
IMO,它真的过于定义"面向对象",但他们所指的是Ruby,不像C#,C++,Java等,不使用定义类 - 你真的只是直接使用对象.相反,在C#中,您可以定义必须通过new关键字实例化为对象的类.关键是你必须在C#中声明一个类或描述它.另外,在Ruby中,所有东西 - 例如偶数 - 都是一个对象.相比之下,C#仍然保留了对象类型和值类型的概念.事实上,我认为这说明了他们对C#和其他类似语言的观点 - 对象类型和价值type暗示一个类型系统,意味着你有一个描述类型的整个系统,而不是仅仅使用对象.
从概念上讲,我认为OO 设计提供了用于处理软件系统复杂性的抽象概念.该语言是实现OO设计的工具 - 有些使其比其他设计更自然.我仍然认为,从更常见和更广泛的定义来看,C#和其他仍然是面向对象的语言.
OOP有三个支柱
封装
遗产
多态性
如果一种语言可以做这三件事,那么它就是一种OOP语言.
我很确定语言X的论点比语言A更好地完成OOP会永远持续下去.