接口与抽象类
=======================================
这里我也来说说接口和抽象类,权当抛砖引玉了,一直到现在,我自己对接口和抽象类的区别都还是比较模糊,这里有什么不对的,就请提出来,
但请不要有过激言论,这里的很多言论我都参考网上的,不知道能不能算自己的原创发到首页。
抽象类与接口的不同,请大家参考再谈抽象类与接口的区别,我也就不说了,那什么时候选 抽象类,又什么时候选接口呢,好现在我来说一种情况。
现在我定义一个人的类,简单起见,我略写,如下:
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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?