2014-07-18 48 views
1

我有這樣的狗類:如何使用類成員實現接口?

public class Dog : IBarkable 
{ 
     public void Bark() 
     { 
      Console.WriteLine("Woof!"); 
     } 
} 

和我有這個人等級:

public class Human : IBarkable 
{ 
     private Dog _myDog = new Dog(); 

     public void Bark() 
     { 
      _myDog.Bark(); 
     } 
} 

有沒有,我不會要明確實現每個功能的任何方式? 類似的東西:

public class Human : IBarkable (_myDog) 
{ 
     private Dog _myDog = new Dog(); 
} 

謝謝!

+1

沒有自動接口實現委託,這就是爲什麼'繼承構成'有時很痛苦的原因之一(如果不是主要原因)。你必須手動完成。 –

+8

這是一個強有力的表示'Human'不應該實現'IBarkable',它應該有一個方法/屬性返回一個'IBarkable'對象(在這個例子中是狗)。 – Servy

+0

@Servy:在人類身上使用與人類相互作用的方法不是更好嗎?只要將它交給任何需要它的人,你都不想鬆懈。 (demeter法) – jgauffin

回答

1

儘管在Visual Studio中沒有實現委託成員的功能,但resharper提供了一個。

您正在尋找resharper的Generating Delegating Members

1

從邏輯的角度來看,人類不能叫囂。所以從這個界面派生出一個人是沒有意義的。相反,你應該至少提供一個返回你的狗對象的getter方法。

+0

爲什麼他應該按照你的建議來打破德米特法呢? – jgauffin

0

如果你試圖暴露人類的「寵物」,更靈活和技術上正確的方法是抽象樹皮方法並使人暴露「寵物」的某些方面。就API設計而言,在人類物體上使用「Bark」方法並不是很直觀。還要考慮:如果人類像貓,鸚鵡,猴子和寵物大象那樣呢?在這種情況下,您的代碼變得難以維護(我懷疑這是您爲什麼要「自動實現」接口方法的原因)。

我建議你的代碼的重構輕微到更多的東西是這樣的:

public interface ISpeakingAnimal { 

    void Speak(); 

} // end interface IAnimal 

public interface IHasPets { 

    List<ISpeakingAnimal> Pets {get; set;} 

    bool HasPets(); 

} // end interface IHasPets 

public class Dog : ISpeakingAnimal { 

    public void Speak() { 
     Console.WriteLine("Woof"); 
    } 
} // end class Dog 

public class Cat : ISpeakingAnimal { 

    public void Speak() { 
     Console.WriteLine("Meow"); 
    } 
} // end class Cat 

public class Human : IHasPets { 

    public Human() { 
     Name = "The Doctor"; 
     Pets = new List<ISpeakingAnimal>(); 
    } // end constructor 

    public string Name {get; set;} 

    public List<ISpeakingAnimal> Pets {get; set;} 

    public bool HasPets() { 
     return Pets.Any(); 
    } // end method HasPets 

} // end class Human 

//Somewhere in your executing code 
Human person1 = new Human(); 
ISpeakingAnimal dog = new Dog(); 
ISpeakingAnimal cat = new Cat(); 
person1.Pets.Add(dog); 
person1.Pets.Add(cat); 

for(int i = 0; i<person1.Pets.Count; i++) { 
    person1.Pets[i].Speak(); 
} // end for loop 

這encompases幾個堅實的軟件開發實踐,它如果你有興趣,你可以在此處詳細瞭解:http://www.blackwasp.co.uk/SOLID.aspx

此設計允許您在任何時候添加新類型的寵物,而無需對人體或其他動物進行更改。你可以添加方法給人類與它的寵物進行交互,而不會改變人類的實際性質(因爲我們通常不會吠叫;))。

相關問題