2015-07-10 40 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