7.C#知识点:抽象类和接口浅谈
首先介绍什么是抽象类?
抽象类用关键字abstract修饰的类就是叫抽象类,抽象类天生的作用就是被继承的,所以不能实例化,只能被继承。而且 abstract 关键字不能和sealed一起使用,因为sealed是不允许继承,这样就是抽象类的意义冲突了。
public abstract class Test { }
现在我们知道知道了抽象类长的什么样了,下面要知道抽象类是干嘛用的。顾名思义把对象共有的东西抽象出来。比如猫和和狗鸟等都有眼睛,都有嘴巴。那我们就可以抽象出一个动物类。把眼睛和嘴巴放到这这些公共的部分抽象到动物类里里面。用来对继承于动物类的子类进行约束。下次在有一个狗。只要继承于动物类那么狗必须实现眼睛和嘴巴。
Dog类 继承了 Animal抽象了。VS提示我们没有实现抽象类Animal类的两个方法。由此可以看出抽象类是对子类的约束。说白了。抽象类就是对子类的抽象,即将子类中的公共部分提取出来,放到一个特定的类中。抽象类是一份合约,用于为同一类型(这里类型不是指数据类型,而是逻辑上的划分,如人和猫都是动物)的子类提供约束。约束他们的公共部分。
现在来总结下抽象类。
1.抽象类的定义需要abstract关键字
2.抽象类的存在的意义就是被继承的。所以不能实例化,不能与sealed关键字一起用。
3.抽象类允许存在非抽象方法和抽象方法。
4.抽象类的抽象成员,子类必须实现。
在来看看接口,接口和抽象类很多概念相似。接口的创建要用到interface,接口出现的意义也是被继承。也不能与sealed关键字一起用
public interface Animal { void Run(); void Say(); }
接口的和抽象类功能一样,也是抽象公共部分。
从逻辑上与抽象类区分的话。总结成一句话。就是接口约束子类对象的行为。抽象类是将同一类型类的公共部分提取出来,进行约束。注意这里的同一类型不是数据类型而是逻辑上的,比如人和啊猫啊狗都是动物。
来总结下两者的区别
1.学过C#的都知道类只能单继承,接口可以多继承。这个就是抽象类和接口的第一个区别。
2.接口不能包含已经实现成员,但是抽象类是可以的
3.接口的成员默认1实现是public的,但是抽象类的成员可以被访问修饰修饰但是不能是私有的。
4.抽象类多用于约束对象的核心基础成员,接口对于用于约束子类的行为。比如类型有哪些行为(方法)。
5.接口成员如果变动的话,实现子类全部都要变动,抽象只有抽象成员变动了子类才要变动。
6.接口不允许定义字段,抽象允许定义字段,但是不允许定义抽象字段。
最有精华的两句话
抽象类和接口都是一种约束,这种约束使我们的代码有更好的层次结构,特别是在多人协同开发时(若每个人都按照自己的习惯来,对整个开发团队而言,开发成本不知要提高多少)。
抽象类是对相同类型(不是数据类型)子类公共部分的抽象(约束),接口是对能力的一种约束
参考的大牛的博客------>传送门