Java和C#细微差别导致迥异的解决思路
对于不熟悉的C#的来说,你可以认为代理就是函数指针,事件就是一个特殊的类属性,它能自动的管理一组代理。所有这些监听接口和内部类在Java写起来很麻烦,如果有了C#中的那种机制,就能减少到一行。
在Java中实现Observer Pattern的复杂度常常使我不愿意去使用它,但是,在C#中我会毫不犹豫的使用。结果是,我在C#中设计代码和在Java中设计代码非常的不相同。我并不是有意设计得不相同的。只是每个语言有自己的自然特性,是我很自然的采取合适的方式来解决特定问题。
virtual方法
在Java中,所有的方法都能被覆写。为了禁止这种覆写的某种方法,你不得不明确的用final关键字声明。C#中正好是相反的。C#中的一个类的方法是不能被覆写的,出给你用virtual关键字明确声明。
和Java相比,这仅仅是一个小的变化吗?决不是的。在C#这种机制下,你想做出很小的行为改变是很困难的。有时甚至让我神经质。
唯一的解释是C#为了追求性能才这么做的。调用一个覆写的方法需要额外的步骤,需要去查找表格,而不是直接的执行。现在,这仍有争论。如果你想让你的应用程序能够在将后扩展的话,使用C#将是错误的。
允许其它的代码来覆写你的类方法能够使得你的类具有可扩展性。虽然一些类使用Template Method设计方式来限制覆写方法,但是大多数的类设计者很少能预测到他们设计的类该不该被覆写,具有多态的行为。这是很难预料的。
大多数的开发者会使用默认的方式来设计类,除非他们能事先知道特使类的用途才采取特殊的措施。因此,采用默认的方式是最为有用和最具扩展的方法。
表面上两种语言细小的不同,却使我考虑问题的思维极大不同。知道C#的类会限制多态(除非你为每一个方法都声明为virtual)的特性,我会被迫采取和开发Java应用程序不同的解决方案。
结论
这两个例子并没有暗示C#好,或是Java好。但是,它们明确的指出在这两语言之间转变的时候,开发者需要采取不同的思考方式,采取不同的解决方案。
在Java中实现Observer Pattern的复杂度常常使我不愿意去使用它,但是,在C#中我会毫不犹豫的使用。结果是,我在C#中设计代码和在Java中设计代码非常的不相同。我并不是有意设计得不相同的。只是每个语言有自己的自然特性,是我很自然的采取合适的方式来解决特定问题。
virtual方法
在Java中,所有的方法都能被覆写。为了禁止这种覆写的某种方法,你不得不明确的用final关键字声明。C#中正好是相反的。C#中的一个类的方法是不能被覆写的,出给你用virtual关键字明确声明。
和Java相比,这仅仅是一个小的变化吗?决不是的。在C#这种机制下,你想做出很小的行为改变是很困难的。有时甚至让我神经质。
唯一的解释是C#为了追求性能才这么做的。调用一个覆写的方法需要额外的步骤,需要去查找表格,而不是直接的执行。现在,这仍有争论。如果你想让你的应用程序能够在将后扩展的话,使用C#将是错误的。
允许其它的代码来覆写你的类方法能够使得你的类具有可扩展性。虽然一些类使用Template Method设计方式来限制覆写方法,但是大多数的类设计者很少能预测到他们设计的类该不该被覆写,具有多态的行为。这是很难预料的。
大多数的开发者会使用默认的方式来设计类,除非他们能事先知道特使类的用途才采取特殊的措施。因此,采用默认的方式是最为有用和最具扩展的方法。
表面上两种语言细小的不同,却使我考虑问题的思维极大不同。知道C#的类会限制多态(除非你为每一个方法都声明为virtual)的特性,我会被迫采取和开发Java应用程序不同的解决方案。
结论
这两个例子并没有暗示C#好,或是Java好。但是,它们明确的指出在这两语言之间转变的时候,开发者需要采取不同的思考方式,采取不同的解决方案。
0
相关文章