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对象。接口没有“代码体”,它是一个契约,它只定义可用的行为,而不是如何执行。