在接口上调用子类而不在那里实现方法

时间:2012-11-02 15:08:59

标签: c# inheritance interface

我有界面IPet,而在另一个项目中我有Dog继承自IPet的课程。
Dog中,我的方法为Bark(),但IPet没有 在IPet的项目中,我还有一个PetSimulation类,其中我有一个IPet的实例。
现在我想做这样的事情:

IPet myDog = new IPet("Rex");  
myDog.Bark();  

但是IPet没有方法Bark(),并且应该保持这种方式,因为其他类(例如CatHorse)也是从IPet继承的但也没有方法Bark 我也做不到这样的事情:

Dog myDog = new Dog("Rex");  

因为Dog在另一个项目中。

有没有办法让我在接口Bark上调用子类Dog的方法IPet而不在那里实现方法?

4 个答案:

答案 0 :(得分:2)

简短回答:不。

答案稍长:

您可以测试IPet以查看它是否为Dog,如下所示:

Dog dog = myDog as Dog;
if (dog != null)
{
    dog.Bark();
}

请注意,您无法像在问题中那样直接创建界面,very rare circumstances除外。

答案 1 :(得分:1)

你不能。但是你可以使用Bark方法创建一个接口IDog,它将继承自IPet

public interface IPet
{

}

public interface IDog : IPet
{
    void Bark();    
}

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

答案 2 :(得分:0)

您需要将myDog强制转换为Dog才能访问只有该类具有的方法:

IPet myDog = new IPet("Rex");  
((Dog)myDog).Bark();  

如果在界面中实现Bark,那么实现它的所有类都需要它。

您可以通过添加对Dog的项目的参考来访问Dog吗?

答案 3 :(得分:0)

如果您真的无法访问Dog类并且正在使用.NET 4+,那么您可以尝试

dynamic dog = new ...
dog.Bark()