区分接口和抽象类

一 . 接口

1 因为C#不支持多重继承,所以有了接口,一个类只能继承一个父类,但可以实现多个接口,接口本身也可以继承多个接口。

2 接口里面的成员变量默认都是public static final类型的。必须被显示的初始化。

3 接口里面的方法默认都是public abstract类型的。隐式声明。

4 接口没有构造方法,不能被实例化。

5 接口不能实现另一个接口,但可以继承多个接口

6 类如果实现了一个接口,那么必须实现接口里面的所有抽象方法,否则类要被定义为抽象类

2 . 抽象类

1 如果将一个类声明为abstract,此类不能生成对象,只能被继承使用。

2  抽象方法必须存在于抽象类中。

3  抽象类中可以有一般的变量和一般的方法。

4 子类继承抽象类必须实现其中抽象方法,除非子类为抽象类。 
   private void print(){};此语句表示方法的空实现。 
   abstract void print(); 此语句表示方法的抽象,无实现。

 

接口和抽象类的区别

1 接口只能包含抽象方法,抽象类可以包含普通方法。 
2 接口只能定义静态常量属性,抽象类既可以定义普通属性,也可以定义静态常量属性。 
3 接口不包含构造方法,抽象类里可以包含构造方法。    

抽象类不能被实例化,但不代表它不可以有构造函数,抽象类可以有构造函数,备继承类扩充

1 接口是核心,其定义了要做的事情,包含了许多的方法,但没有定义这些方法应该如何做。 
2 如果许多类实现了某个接口,那么每个都要用代码实现那些方法 
3 如果某一些类的实现有共通之处,则可以抽象出来一个抽象类,让抽象类实现接口的公用的代码,而那些个性化的方法则由各个子类去实现。

所以,抽象类是为了简化接口的实现,他不仅提供了公共方法的实现,让你可以快速开发,又允许你的类完全可以自己实现所有的方法,不会出现紧耦合的问题。

应用场合很简单了 
1 优先定义接口 
2 如果有多个接口实现有公用的部分,则使用抽象类,然后集成它。

 

如果单从具体代码来看,对这两个概念很容易模糊,甚至觉得接口就是多余的,因为单从具体功能来看,除多重继承外(C#,Java中),抽象类似乎完全能取代接口。但是,难道接口的存在是为了实现多重继承?当然不是。我认为,抽象类和接口的区别在于使用动机。使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性。所以,如果你在为某个地方该使用接口还是抽象类而犹豫不决时,那么可以想想你的动机是什么。

看到有朋友对IPerson这个接口的质疑,我个人的理解是,IPerson这个接口该不该定义,关键看具体应用中是怎么个情况。如果我们的项目中有Women和Man,都继承Person,而且Women和Man绝大多数方法都相同,只有一个方法DoSomethingInWC()不同(例子比较粗俗,各位见谅),那么当然定义一个AbstractPerson抽象类比较合理,因为它可以把其他所有方法都包含进去,子类只定义DoSomethingInWC(),大大减少了重复代码量。

但是,如果我们程序中的Women和Man两个类基本没有共同代码,而且有一个PersonHandle类需要实例化他们,并且不希望知道他们是男是女,而只需把他们当作人看待,并实现多态,那么定义成接口就有必要了。

总而言之,接口与抽象类的区别主要在于使用的动机,而不在于其本身。而一个东西该定义成抽象类还是接口,要根据具体环境的上下文决定。

再者,我认为接口和抽象类的另一个区别在于,抽象类和它的子类之间应该是一般和特殊的关系,而接口仅仅是它的子类应该实现的一组规则。

(转自脚本之家)

posted @ 2019-07-30 16:41  WeiMLing  阅读(318)  评论(0编辑  收藏  举报