C# 通过接口调用子类的方法,而不在接口上实现该方法

C# 通过接口调用子类的方法,而不在接口上实现该方法,c#,inheritance,interface,C#,Inheritance,Interface,我有接口IPet,在另一个项目中,我有类Dog,它继承自IPet 在Dog中,我有Bark()方法,但在IPet中没有 在IPet项目中,我还有类PetSimulation,其中我有一个IPet的实例 现在我想做这样的事情: IPet myDog = new IPet("Rex"); myDog.Bark(); Dog myDog = new Dog("Rex"); 但是IPet没有方法Bark(),这应该保持不变,因为其他类,如Cat和Horse也继承自IPet,但也没有方法B

我有接口
IPet
,在另一个项目中,我有类
Dog
,它继承自
IPet

Dog
中,我有
Bark()
方法,但在
IPet中没有

IPet
项目中,我还有类
PetSimulation
,其中我有一个
IPet
的实例
现在我想做这样的事情:

IPet myDog = new IPet("Rex");  
myDog.Bark();  
Dog myDog = new Dog("Rex");  
但是
IPet
没有方法
Bark()
,这应该保持不变,因为其他类,如
Cat
Horse
也继承自
IPet
,但也没有方法
Bark

我也不能这样做:

IPet myDog = new IPet("Rex");  
myDog.Bark();  
Dog myDog = new Dog("Rex");  
因为狗在另一个项目中


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

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

IPet myDog = new IPet("Rex");  
((Dog)myDog).Bark();  
如果您在接口中实现了树皮,那么所有实现它的类都需要它


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

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

IPet myDog = new IPet("Rex");  
((Dog)myDog).Bark();  
如果您在接口中实现了树皮,那么所有实现它的类都需要它

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

简短回答:否

稍长一点的回答:

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

Dog dog = myDog as Dog;
if (dog != null)
{
    dog.Bark();
}
请注意,除了在中,您不能像在问题中那样直接创建界面。

简短回答:否

稍长一点的回答:

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

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

请注意,除了在中,您不能像在问题中那样直接创建接口。

如果您确实无法访问Dog类并且正在.NET 4+中工作,您可以尝试

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

如果您确实无法访问Dog类并且正在.NET4+中工作,您可以尝试

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

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

public interface IPet
{

}

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

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

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

public interface IPet
{

}

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

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

你能给你的界面添加一个新方法
Speak()
吗?@DanPichelman不,界面必须保留,就像现在一样。你能给你的界面添加一个新方法
Speak()
吗?@DanPichelman不,界面必须保留,现在是这样。没有,因为Dog项目是主要项目,并且已经参考了IPet项目。所以我不能以另一种方式添加参考…不,因为Dog项目是主要项目,并且已经有了IPet项目的参考。所以我不能以另一种方式添加引用…我明白了。。。这对我来说不起作用,因为在那个时候我并没有接触到狗,只有IPet。通过实现:原始代码更长、更复杂。我想让它尽可能简单。我明白了。。。这对我来说不起作用,因为在那个时候我并没有接触到狗,只有IPet。通过实现:原始代码更长、更复杂。我想让它尽可能简单,这样你就可以调用这个方法了。但是,如果没有对包含实际实现(从IDog派生的类)的项目/程序集的引用,仍然无法在项目/程序集中创建IDog对象。接口没有“代码体”,它是一个契约,它只定义可用的行为,而不是如何执行。因此,这将使您能够调用方法。但是,如果没有对包含实际实现(从IDog派生的类)的项目/程序集的引用,仍然无法在项目/程序集中创建IDog对象。接口没有“代码体”,它是一个契约,它只定义可用的行为,而不是如何执行。