小弟比较菜,没有系统的学过面向对象,最近在使用接口时遇到了这种问题。
直接上代码吧
public interface IAnimal
{
void Shout();
}
public class Dog:IAnimal
{
public void Shout()
{
Console.WriteLine("wang");
}
}
public class Cat:IAnimal
{
public void Shout()
{
Console.WriteLine("miao");
}
public void ClimbTree()
{
}
}
public static void Main()
{
IAnimal a = new Dog();
IAnimal b = new Cat();
a.Shout();
b.Shout();
b.ClimbTree();//我想调用猫的爬树方法要如何做?难道只能把b声明为Cat?还是说再抽象出一个爬树接口?
}
就如上面所写,实现接口I的类A,存在一个特殊方法,但是因为实例化时声明为接口类型了,就没办法调用这个方法了,请教一下一般如何处理,多谢
接口的作用是总结共性,你要用特性的东西,就不要用接口。多态也是共性的多态,而不是特性的多态。
面向对象解决的只是归纳共性,利用多态来解决问题。
调用shout函数就很好的体现了多台(因为不管是dog,还是cat,都是一样的调用代码)
但是你没有理由认为只属于cat的函数也能通过接口来调用。
那如果你想用cat特有的代码,怎么办?
答:直接用cat的变量。
((Cat)b).ClimbTree();
需要强制转换一下。
必须要强制转换一下,Dog和Cat都是IAnimal类型,理所应当可以Shout,但是只有Cat可以ClimbTree,所以需要转换成Cat才可以。
换句话说,Cat is IAnimal,Dog is IAnimal,But not all IAnimal is Cat
你要变回猫才可以ClimbTree,动物是不会爬树D.