2017-04-03 92 views
0

我怎樣才能做到這一點:我可以從基類調用孩子的父方法嗎?

class BaseClass{ 
    void templateMethod(){ 
    methodImplementation(); 
    if(this.base.getType() != typeof(BaseClass)) this.base.methodImplementation(); 
    } 
    void abstract methodImplementation(); 
} 
class Derived1 : BaseClass{ 
    void override methodImplementation(){ 
    .. do things .. 
    } 
} 
class Derived2 : Derived1{ 
    void override methodImplementation(){ 
    .. do more things .. 
    } 
} 

那麼這將導致兩個實現(的東西,更多的東西)執行。

Derived2 object = new Derived2(); 
object.templateMethod(); 

然後,所有的孩子和孫子女等等,只需要實現自己的methodImplementation的一部分,並在最後的對象調用時它會被調用在所有水平。

但是this.base不是一件東西。我需要的是調用實例化對象真實類的父對象的實現,但代碼位於baseClass中,因此我可以在Template方法模式中使用它。

在此先感謝,抱歉,如果我沒有讓自己清楚。我只需要知道它是否可以完成。這是良好的做法,最佳,推薦或有用的是我會考慮的另一件事。

編輯:

上面的代碼是不完全正確的,它應該是這樣的:

class BaseClass{ 
    void templateMethod(){ 
    methodImplementation(); 
    if(this.base.getType() != typeof(BaseClass)) this.base.templateMethod(); 
    } 
    void abstract methodImplementation(); 
} 
class Derived1 : BaseClass{ 
    void override methodImplementation(){ 
    .. do things .. 
    } 
} 
class Derived2 : Derived1{ 
    void override methodImplementation(){ 
    .. do more things .. 
    } 
} 

的不同之處在於在BaseClass.templateMethod()什麼被調用在第二行是templateMethod ()而不是methodImplementation(),所以它調用它自己,但是從父類的「視角」。現在我越來越想這是不可能的,並且比任何事情都造成更多的困惑。

+1

你應該堅持術語'Derived'和'Base',這很容易混淆你想要做的事情...... – user3292642

+0

this.base可能不是一件東西,而只是基礎。templateMethod()應​​該是? – Slicc

+1

如果您只想從派生類調用基類的方法。爲什麼你需要使方法抽象並覆蓋它? – user3292642

回答

1

如果我理解正確,您想要從頂級派生類中調用所有methodImplementation。你可以這樣說:

class BaseClass{ 
    void templateMethod(){ 
    methodImplementation(); 
    } 
    void abstract methodImplementation(); 
} 
class Derived1 : BaseClass{ 
    // virtual as you want to derive it again 
    virtual void override methodImplementation(){ 
    //.. do things .. 
    } 
} 
class Derived2 : Derived1{ 
    void override methodImplementation(){ 
    //.. do more things .. 
    base.methodImplementation(); 
    } 
} 

每一個派生類只需要實現他的methodImplementation和結束部分調用它們的基類。由於methodImplementationabstract請勿在第一級調用base。同時將所有methodImplementation標記爲虛擬,以便您可以重新覆蓋它。

+0

是的,我知道我可以做到這一點,但我想知道我是否可以避免需要在每個派生類中都調用base.methodImplementation()。做這件事並不是那麼努力,但是如果它在底層完成了一次,然後通過一個接口強制所有的實現,這將是一個乾淨的方式來強制所有的孩子執行它們,甚至不需要它們致電父母。 – mikepa88

0

您可以在派生類中調用基本方法。這是一個例子。您可以在派生類的每一行中調用基本方法;取決於你想要執行邏輯的時間。

public class Animal 
{ 
    public void WhatAmI() 
    { 
     Console.WriteLine("Animal"); 
    } 
} 

public class Fish : Animal 
{ 
    public new void WhatAmI() 
    { 
     base.WhatAmI(); 
     Console.WriteLine("Fish"); 
    } 
} 

public class HammerheadShark : Fish 
{ 
    public new void WhatAmI() 
    { 
     base.WhatAmI(); 
     Console.WriteLine("HammerheadShark"); 
    } 
} 

當調用WhatAmI方法:

var animal = new HammerheadShark(); 
animal.WhatAmI(); 

你會得到這樣的:

動物

雙髻鯊

+0

是的,我知道我可以這樣做,但我想知道是否可以避免需要在每個派生類中都調用base.methodImplementation()。做這件事並不是那麼努力,但是如果它在底層完成了一次,然後通過一個接口強制所有的實現,這將是一個乾淨的方式來強制所有的孩子執行它們,甚至不需要它們致電父母。 – mikepa88

+1

你的代碼應該如何知道你想在不調用方法的情況下執行某些邏輯?沒有寫你的孩子和/或父母的代碼是沒有辦法的。 –

0

好的,即使有一種令人費解的方式來做到這一點,它甚至不會用於我所需要的,我想這對任何一種體面的代碼都沒有用。

+0

如果您覺得這是正確的答案,請接受此作爲答案或完全刪除問題,如果您認爲保持這一點並不是非常有用。 – PJvG

+0

@PJvG我現在不能接受我自己的安澤,我必須等兩天。 – mikepa88

相關問題