2016-05-13 49 views
0

一位同事向我介紹了通過允許派生類覆蓋私有字段初始化來隱藏實現細節的概念。通過使用受保護的虛擬隱藏實現細節

比如我有一個基類:

public class Animal 
{ 
    private Dog dog; 
    private Cat cat; 
    private Mouse mouse; 

    protected virtual void Init() 
    { 
     dog = new Dog(); 
     cat = new Cat(); 
     mouse = new Mouse(); 
    } 

    public void DoStuff() {} 

} 

這讓我派生類的基類下身內覆蓋初始化:

public class Cookie : Animal 
{ 
    protected override void init() 
    { 
     //do whatever i want here 
    } 
} 
  1. 請問這類型的實現 - 尾巴隱藏有一個名字?
  2. 我會從動物調用Init()還是這個模式堅持Init(),因爲從派生類調用?

我想實現什麼?

我有一個類(上面的例子中的動物),有大約20個需要初始化的私有對象,我希望能夠定義我自己的方式,特別是在進行單元測試時初始化它們。

+0

你的第二個問題不清楚,你可以請你重新說明和解釋你想達到什麼目的。 –

+0

@SirajMansour更新回答你的問題 –

+0

嗯...我想我們稱之爲「虛擬方法」? https://msdn.microsoft.com/en-us/library/aa645767(v=vs.71).aspx - 順便說一句,你應該看看SRP,他們在哪裏把耳朵上的整個範例。 – code4life

回答

1

這就是所謂的override

重寫方法提供了一個從基類繼承的成員的新實現,即 。

您可以通過使用base.Init();調用從derived classbase class'overriden methodInit()

2

1)這只是重寫,我不知道它不止於此。但是你不能訪問子類中的私有字段,它們也必須受到保護,所以你可以在你的子類中訪問它們。

2)你的問題並不清楚,但我猜你在問如何從override中調用基類的方法。所有你需要做的是

public class Cookie : Animal 
{ 
    protected override void init() 
    { 
     //do whatever you want here 
     base.init(); //This line will call the init() function in Animal. 
     //do whatever you want here 
    } 
} 
相關問題