【发布时间】:2012-05-28 09:29:11
【问题描述】:
在知道派生类的基类中创建方法是一种好的 OO 编程实践吗?
例如考虑 A、B、C、D 类,其中 B 类从 A 继承,C 和 D 类从 B 继承。现在考虑一个对从 A 继承的所有类(包括 A 本身)通用的方法,并且它需要了解 B 类才能工作(例如:A/B/C/ 或 D 类的对象与对象 B 的相对距离)。由于此方法对所有类(A、B、C、D)都是通用的,因此它应该放在类 A 中听起来很合乎逻辑。但是在这种情况下,我们将在基类中有一个方法可以“知道”派生类。
例子:
Class A {
# simple coordinate system
distance_to_complex_coordinate_system (B complexCoord) {
return complexCoord.distance_to_simple_coord_system(self)
}
}
Class B extends A {
# complex coordinate system
distance_to_simple_coordinate_system (simpleCoord) {
# do calculations
}
}
Class C extends A {}
Class D extends A {}
...
在上面的例子中,distance_to_complex_coordinate_system 是所有简单坐标系(即 A、B、C 和 D)都应该具有的方法,并且它们的实现完全相同。它不是抽象类,因此不应被覆盖。
从 OO 的角度来看,这是否有意义?如果确实如此,这真的是一种很好的编程实践吗?如果没有,任何有关如何避免这种情况的建议将不胜感激。
在我看来,这不是一个好习惯,但我找不到一种避免它的好方法,而无需不必要地重复代码。 顺便说一句,虽然可能并不重要——我正在使用 Perl。
【问题讨论】:
-
你说“所有的实现都是一样的”,这让我相信
A知道为了计算distance_to_simple_coord_system()的值它需要知道的一切。您最初声明A需要了解B中的实现,但在您澄清后似乎并非如此。我怀疑,您的子类对distance_to_simple_coordinate_system ()的实现会略有不同,否则为什么要覆盖此方法? -
distance_to_simple_coord_system是 B 类的方法,只有这个类知道如何计算。 A 类和所有其他类需要知道 B 类存在,因此使用distance_to_complex_coordinate_system -
我不想重写
distance_to_simple_coordinate_system这个方法只存在于B类中,其他地方都不存在。问题在于distance_to_complex_coordinate_system需要知道 B 类存在。
标签: oop inheritance derived-class base-class