2011-04-17 64 views
0

出於學術目的,我想知道父母方法調用是否應該導致父母的父母方法調用,如果父母沒有這樣的方法?如果父代沒有這種方法,父函數調用是否應該調用父代的父代?

例如(僞代碼):

class A { 
    function doSomething() { 
    } 
} 

class B extends A {} 

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

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

是否在面向對象的語言父母呼意味着,如果父缺少方法,其母公司將呼籲其方法呢?

回答

1

在OOP中,這個問題通常通過函數doSomething的可見性來回答。

如果它是在A類保護的或公共的,然後,如果它不是在B

覆蓋它會被稱爲(我也認爲這裏說的extends關鍵字公有繼承。見http://www.learncpp.com/cpp-tutorial/115-inheritance-and-access-specifiers/爲更多信息。)

+0

假設'public',那麼答案是'yes'(因爲B顯然不會覆蓋任何東西)? – Tower 2011-04-17 15:08:31

+0

是的,你也可以試試:) – 2011-04-17 15:10:39

+0

我正在寫維克多帕爾馬張貼。冗餘不是故意的。 。 。 ;-) – XIVSolutions 2011-04-17 15:18:30

1

親子「擴展」/單繼承的語義強烈暗示「只要你可以使用父母,你也可以使用孩子」。

也就是說,孩子的特徵應該是父母的超集。因此,由於上述原則,單一繼承的大多數理智的實現將使得子級的默認行爲與父級完全一致。

當然,在工作中可能還有其他的東西,例如語言可能支持接口,按合同設計等。在這種情況下,父方法可能是存根或抽象的不可解釋的方法,知道什麼樣的政策可能會生效。

注意:其他答案關於public-vs-private的討論對於Java類語言來說確實是特定的,而不是(如問題的標籤所暗示的)一般的OOP。除非你認爲可見性是普通OOP的一部分(python語言可能會反對)。

1

如果A上定義的DoSomething的範圍是Public,那麼DoSomething也是B的公共intefrace的一部分。因此,DoSomething方法也將成爲C公共接口的一部分。由於在派生類繼承的A上定義的原始方法,父類方法將被派生類調用,除非它被覆蓋。

在某種程度上,所有在特定範圍內工作的細節可能會被特定語言所確定,但一般的面向對象原則遵循上述概念。 。 。