首页 新闻 会员 周边

一个比较菜的面向对象问题

0
悬赏园豆:10 [已解决问题] 解决于 2010-07-27 09:13

小弟比较菜,没有系统的学过面向对象,最近在使用接口时遇到了这种问题。

直接上代码吧

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,存在一个特殊方法,但是因为实例化时声明为接口类型了,就没办法调用这个方法了,请教一下一般如何处理,多谢

rad的主页 rad | 初学一级 | 园豆:28
提问于:2010-07-14 16:07
< >
分享
最佳答案
0

接口的作用是总结共性,你要用特性的东西,就不要用接口。多态也是共性的多态,而不是特性的多态。

面向对象解决的只是归纳共性,利用多态来解决问题。

调用shout函数就很好的体现了多台(因为不管是dog,还是cat,都是一样的调用代码)

但是你没有理由认为只属于cat的函数也能通过接口来调用。

 

那如果你想用cat特有的代码,怎么办?

答:直接用cat的变量。

收获园豆:2
诺贝尔 | 初学一级 |园豆:37 | 2010-07-18 09:47
其他回答(4)
0

((Cat)b).ClimbTree();

收获园豆:2
Launcher | 园豆:45045 (高人七级) | 2010-07-14 16:23
那我原本只需要依赖接口IAnimal,现在岂不是还要依赖Cat了?
支持(0) 反对(0) rad | 园豆:28 (初学一级) | 2010-07-14 16:29
0

需要强制转换一下。

收获园豆:2
Astar | 园豆:40805 (高人七级) | 2010-07-14 16:25
0

必须要强制转换一下,Dog和Cat都是IAnimal类型,理所应当可以Shout,但是只有Cat可以ClimbTree,所以需要转换成Cat才可以。

换句话说,Cat is IAnimal,Dog is IAnimal,But not all IAnimal is Cat 

收获园豆:2
镜涛 | 园豆:575 (小虾三级) | 2010-07-14 20:14
0

你要变回猫才可以ClimbTree,动物是不会爬树D.

收获园豆:2
小堆爸 | 园豆:7 (初学一级) | 2010-07-23 15:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册