2015-04-29 183 views
1

我不完全确定如何问这个问题,但基本上我想要做的就是访问IDog的抽象方法。试想一下:接口 - 实现抽象类方法

static void Main(string[] args) 
    { 
     IDog dog = new Dog(); 
     dog.CatchFrisbee(); 
     dog.Speak("Bark") // error -> no implementation 
     Console.ReadLine(); 
    } 

    public class Dog : Animal, IDog 
    { 
     public void CatchFrisbee() 
     { 
      Console.WriteLine("Dog Catching Frisbee"); 
     } 
    } 
    public abstract class Animal : IAnimal 
    { 
     public void Speak(string sayWhat) 
     { 
      Console.WriteLine(sayWhat); 
     } 

     public void Die() 
     { 
      Console.WriteLine("No Longer Exists"); 
     } 
    } 
    public interface IDog 
    { 
     void CatchFrisbee(); 
    } 
    public interface IAnimal 
    { 
     void Die(); 

     void Speak(string sayWhat); 
    } 

从我的静态无效的主要,我想能够调用dog.Speak(),但我不能,因为它不是在IDOG实现。我知道我可以很容易地从我的派生类访问Speak(),但是可以从实现中访问它,还是这会是一个糟糕的设计?

回答

6

假设所有IDog s为IAnimal S,宣布IDog为实现IAnimal

public interface IDog : IAnimal 
+1

这可能是th更好的解决方案,因为它遵循良好的OOP。 –

+0

@spender谢谢你的回答!我试图在面向对象的实践中变得更加严谨,并遇到了一个我认为这会有所帮助的问题。这是很常见的事情,因为我正在和另一位开发人员交谈,她问我为什么要这么做,好像这是一个糟糕的设计。再次感谢! – Anonymous

+0

你能解释一下继承'Dog'继承'Speak()'的原理,因为'Dog'继承'Animal'和'Animal'实现'Speak()'? – pseudocoder

1

你可以进行一次造型:

((Animal) dog).Speak("Bark"); 

或者利用多接口继承的优势:

public interface IDog : IAnimal 
{ 
    void CatchFrisbee(); 
}