出于学术目的,我想知道父方法调用是否应该导致父方法调用,以防父方没有这样的方法?
例如(伪代码):
class A {
function doSomething() {
}
}
class B extends A {}
class C extends B {
function doSomething() {
parent::doSomething();
}
}
i = new C();
i->doSomething();
父调用面向对象语言是否意味着如果父节点缺少方法,它的父节点会调用其方法吗?
答案 0 :(得分:1)
在OOP中,这个问题通常由函数doSomething
的可见性来回答。
如果它在课程A
中受到保护或公开,那么是,如果未在B
(我在此假设extends
关键字是公共继承。有关详细信息,请参阅http://www.learncpp.com/cpp-tutorial/115-inheritance-and-access-specifiers/。)
答案 1 :(得分:1)
父子“延伸”/单一继承的语义强烈暗示“无论你在哪里使用父母,你也可以使用孩子”。
也就是说,孩子的特征应该是父母的超集。
因此,由于上述原则,大多数纯粹的单继承实现会使子项的默认行为与父项相同。
当然可能还有其他工作,例如语言可能支持接口,按合同设计等等 - 在这种情况下,父方法可能是存根或抽象不可调用的方法,或者谁知道什么政策可能有效。
注意:其他答案关于公共与私有的讨论确实特定于类似Java的语言,而不是(正如问题的标签所暗示的)一般的OOP。除非你认为可见性是一般OOP的一部分(python语言可能会反对)。
答案 2 :(得分:1)
如果A上定义的DoSomething的范围是公共的,那么DoSomething也是B的Public intefrace的一部分。因此,DoSomething方法也将成为C的公共接口的一部分。由于派生类继承了A上定义的原始方法,因此派生类将调用父方法,除非它被覆盖。
在某种程度上,特定范围内所有工作方式的详细信息可能会受到特定语言的影响,但一般的OO原则遵循上述概念。 。 。