2015-07-10 42 views
2

在下面的示例中,我想創建多個類型的繼承PuppyBase基類的Puppies,該基類實現IPuppy通用接口。 Bark方法在基類中強制執行,其他 - 在派生CutePuppy類中。組合繼承,實現和泛型問題

我不能得到如何創建另一隻小狗在這裏誰想要另一個飼料和吠叫不同?

public interface IPuppy<TBark, TDesiredFood> 
{ 
    void Bark(TBark sound); 
    Task<TDesiredFood> Sleep(); 
    Task Eat(TDesiredFood food); 
} 

public abstract class PuppyBase:IPuppy<Yap,Sausage> 
{ 
    public void Bark(Yap sound) 
    { 
     Console.WriteLine(sound.ToString()); 
    } 

    public abstract Task<Sausage> Sleep(); 
    public abstract Task Eat(Sausage food); 
} 

class CutePuppy : PuppyBase 
{ 
    public override Task<Sausage> Sleep() 
    { 
     // Implementation 
     // ... 
     throw new NotImplementedException(); 
    } 

    public override Task Eat(Sausage food) 
    { 
     // Implementation 
     // ... 
     throw new NotImplementedException(); 
    } 
} 
+0

你可以讓它實現成爲另一個IPuppy接口的變體。 'IPuppy ,IPuppy '雖然'Sleep'必須是明確的實現,因爲C#編譯器不允許返回類型重載)。也就是說,這樣的樣品總是很奇怪。例如,你可能不會爲不同的食物有不同的「吃」的實現 - 當你想餵它胡蘿蔔時,你不會明確地將'PuppyBase'投給'IPuppy ',是嗎? :P – Luaan

+1

要解決您的「組合繼承,實現和泛型問題」,請不要使用繼承。只需讓您的類直接實現接口並在複製功能時使用組合。 –

+0

@Luaan,你是對的。在這個例子中這很奇怪,但是在真正的代碼中我真的需要一些方法的不同實現。同時一些方法總是相同的,這就是爲什麼我決定使用基類。大衛阿諾,我會試試看,tnx。 – AsValeO

回答

3

爲了能夠指定在基類的泛型類型,你可以讓它也通用

public abstract class PuppyBase<TBark, TDesiredFood> : IPuppy<TBark, TDesiredFood> 
    where TBark : ISound 
{ 
    public void Bark(TBark sound) 
    { 
     Console.WriteLine(sound.ToString()); 
    } 

    public abstract Task<TDesiredFood> Sleep(); 
    public abstract Task Eat(TDesiredFood food); 
} 

public interface ISound 
{ 
    string ToString(); 
} 

這樣的CutePuppy你應該

class CutePuppy : PuppyBase<Yap,Sausage> 

爲NotSoNicePuppy

class NotSoNicePuppy: PuppyBase<Wow,Human> 
+0

這就是我想要的,謝謝。人類) – AsValeO

+0

太棒了,如果它對你的情況有幫助,你也可以將其標記爲接受的答案) –

+0

我接受之前有5分鐘的超時時間。 – AsValeO