接口与抽象类
=======================================
这里我也来说说接口和抽象类,权当抛砖引玉了,一直到现在,我自己对接口和抽象类的区别都还是比较模糊,这里有什么不对的,就请提出来,
但请不要有过激言论,这里的很多言论我都参考网上的,不知道能不能算自己的原创发到首页。
抽象类与接口的不同,请大家参考再谈抽象类与接口的区别,我也就不说了,那什么时候选 抽象类,又什么时候选接口呢,好现在我来说一种情况。
现在我定义一个人的类,简单起见,我略写,如下:
public abstract class Person
{
public abstract float GetWeight();
}
好了,现在我又有一个歌唱家,显然,他是一个人,好说继承,如下:
public abstract class Singer : Person
{
public abstract void SingSong();
}
现在,我又有一个舞蹈家,显然,这也简单,他也是人,也好说继承,如下:
public abstract class Dancer : Person
{
public abstract void Dance();
}
到现在一切都很好 ,也没有任何的问题,可是,又来了一个人,他说他又会唱歌,又会跳舞,我叫这个类为SingerDancer,好,我在定义一个类,
public abstract class SingerDancer : Singer, Dancer
可是这样对吗?C#里面是不准许多继承的,这是不允许编译通过的,从另一个层面讲,这个明显的违反了单一职责的原则,那这里是不能用抽象类的。
我们再来一个例子:
鸟是可以飞的,这就没有问题,好,先定义 一个类先,如下:
public abstract class Bird
{
public abstract void Fly();
}
在他之上,乌鸦,鸽子,好说,
public abstract class Crow : Bird
{
}
public abstract class Pigeon : Bird
{
}
似乎都很好,没有问题,可是,突然有一天,你在电视里看到说,企鹅也是一种鸟,但是不会飞,这下,你就不好办了,如果,你把这个企鹅类也一样的继承Bird类吗?
public abstract class Penguin : Bird
{
}
可是这样就不好了,你的基类Bird明显就这样设计就不好,明显就有了他不该有的方法。
基于上面的两个例子,接口的威力也就显示也来了,好重新上面的人的例子,用接口来做,
还是一个人类:
public abstract class Dancer : Person
{
public abstract void Dance();
}
对于歌唱家,我们可以这样:
public interface ISing
{
void SingSong();
}
public abstract class Singer : Person, ISing
{
public void SingSong()
{
}
}
同样,对于舞蹈家,我们可以这样,
public interface IDance
{
void Dance();
}
public abstract class Dancer : Person, IDance
{
public void Dance()
{
}
}
对于一个SingerDancer就可以这样比较好的做了,
public abstract class SingerDancer : Person, ISing, IDance
{
public void SingSong()
{
}
public void Dance()
{
}
}
对于Bird,同样的,我们也可以这样来做,下面我就直接给出示例来好了:
public abstract class Bird
{
}
public interface IFly
{
void Fly();
}
public abstract class Crow : Bird, IFly
{
}
public abstract class Pigeon : Bird, IFly
{
}
public abstract class Penguin : Bird
{
}
这样是不是比较好的解决了上面由抽象类而带来的问题呢。
那什么时候用接口呢,也就是在进行行为建模的时候来用接口类,在自己类的固有属性的时候就用抽象类。
作者:OUZI(connoryan)
出处:http://www.cnblogs.com/ouzi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。