如果父函数没有这样的方法,父函数调用应该调用父母的父吗?

时间:2011-04-17 15:00:54

标签: oop class object

出于学术目的,我想知道父方法调用是否应该导致父方法调用,以防父方没有这样的方法?

例如(伪代码):

class A {
    function doSomething() {
    }
}

class B extends A {}

class C extends B {
    function doSomething() {
        parent::doSomething();
    }
}

i = new C();
i->doSomething();

父调用面向对象语言是否意味着如果父节点缺少方法,它的父节点会调用其方法吗?

3 个答案:

答案 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原则遵循上述概念。 。 。