【发布时间】:2012-01-16 20:56:35
【问题描述】:
我试图了解以下问题的答案是否在所有主要的 OOP 语言中都是相同的;如果不是,那么这些语言有何不同。
假设我有定义方法act 和jump 的类A;方法act 调用方法jump。 A 的子类 B 覆盖方法 jump(即,使用适当的语法来确保无论何时调用 jump,都会使用类 B 中的实现)。
我有 b 类 B 的对象。我希望它的行为与 A 类完全一样。换句话说,我希望使用A 中的实现来执行jump。我有哪些不同语言的选择?
例如,我可以通过某种形式的向下转换来实现这一点吗?或者也许通过创建一个知道要调用哪些方法的代理对象?
我想避免创建一个全新的 A 类对象,并仔细设置 a 和 b 之间的内部状态共享,因为这显然不是面向未来的,而且很复杂。我还想避免将b 的状态复制到A 类的全新对象中,因为可能需要复制大量数据。
更新
我问了这个问题specifically about Python,但这似乎在 Python 中是不可能实现的,从技术上讲,它可以做到......有点......
似乎除了技术上的可行性之外,从设计的角度来看,反对这样做的理由也很强烈。我在a separate question 询问这个问题。
【问题讨论】:
-
确实——在 Python 中甚至不存在强制转换的概念。有可能破解大量的内省以使其工作 - 但我认为在其他动态语言中它也不应该是可能的。
-
委派 act 的实现并跳转到其他类(也许是策略),然后不要理会 B。通常,如果您现有的设计让您寻找规避良好 OO 设计的方法,它是是时候退后一步问问原因了。
-
@TerryWilcox:但是这个问题不会出现在动态绑定的任何继承中吗?在这种情况下,每当出现此问题时,我(可能)必须准备好将任何代码从继承重构为其他方法。这将使使用多态性的前景变得非常没有吸引力。我错过了什么?
-
子类化就是改变行为。如果您希望您的实例 b 表现得好像它是一个 A,那么它首先不应该是一个 B。如果我处于您的情况,我会接受继承是一个糟糕的设计并转向组合。例如,只有 A,它使用策略模式来实现不同的行为。
-
@TerryWilcox:那么你会说不太可能需要抑制多态性吗?但如果在我的应用程序中我认为这是一种明显的可能性,我应该尝试使用策略模式,它更强大,但编码成本略高?
标签: oop class inheritance overriding method-hiding