C#中抽象类和接口的异同

抽象类

通过在类定义前面放置关键字 abstract,可以将类声明为抽象类。抽象类不能实例化。 抽象类的用途是提供一个可供多个派生类共享的通用基类定义。 例如,类库可以定义一个抽象类,将其用作多个类库函数的参数,并要求使用该库的程序员通过创建派生类来提供自己的类实现。

抽象类可以包含非抽象的方法、属性以及抽象的方法、属性。抽象类和抽象方法都必须在派生类中用override进行重写。

抽象方法:抽象类也可以定义抽象方法。 方法是将关键字 abstract 添加到方法的返回类型的前面。抽象方法没有实现,所以方法定义后面是分号,而不是常规的方法块。抽象方法只能声明于抽象类中,且不包含任何实现。抽象类的派生类必须实现所有抽象方法。 当抽象类从基类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。

抽象属性:抽象属性声明不提供属性访问器的实现,它只声明该类支持属性,而将访问器实现留给派生类。参考:https://msdn.microsoft.com/zh-cn/library/yd3z1377(v=vs.110).aspx

接口

参考:https://msdn.microsoft.com/zh-cn/library/ms173156.aspx

接口是引用类型,可以实现相关一组功能的定义。接口可以包含方法、属性、事件、索引器,或者这四个成员类型的任意组合。 接口不能包含常数、字段、运算符、实例构造函数、析构函数或类型。 接口成员将自动是公共的,因此,它们不会包含任何访问修饰符。 成员也不能是 静态。若要实现接口成员,实现的选件类的相应成员必须是公共的,非静态的,并且具有名称和签名和接口成员相同。

接口具有下列属性:

- 接口与抽象基类。 实现接口的任何选件类或结构必须实现其所有成员的链接。

- 接口不能直接实例化。 其成员通过实现接口的任何选件类或结构实现。

- 接口可以包含事件、索引器、方法和属性。

- 接口不包含方法的实现。

- 选件类或结构可以实现多个接口。 选件类可以继承基类并实现一个或多个接口。

相同点

接口是引用类型的,类似于类,和抽象类的相似之处有三点:

1. 不能实例化;

2. 包含未实现的方法声明;

3. 派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);

不同点

1. 类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做。。。”。抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中;

2. 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;

3. 一个类一次可以实现若干个接口,但是只能扩展一个父类;

4. 接口可以用于支持回调,而继承并不具备这个特点;

5. 抽象类不能被密封;

6. 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的;

7.(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上;

8. 抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的座位子类去实现;

9. 好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染;

10. 尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中!后果可想而知。(结合堆栈原理理解)。同时,有心的朋友可以留意到微软在构建一个类时,很多时候用到了对象组合的方法。比如
asp.net中,Page类,有Server Request等属性,但其实他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则;

11.如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法。

参考:http://kb.cnblogs.com/page/41836/

时间: 2024-08-07 03:44:30

C#中抽象类和接口的异同的相关文章

【翻译】JAVA中抽象类和接口的区别

不知道有没有人翻译过了,这篇是挺简单的,权当复习一遍内容吧. 很多常见的面试问题如"抽象类和接口有什么区别","你在什么时候用抽象类什么时候用接口".所以在这篇文章里面,我们会讨论一下这个话题. 在开始讨论它们的区别之前,我们先看看它们的介绍. Abstract class 抽象类 抽象类被用来抽象出子类的共同特征.它是不能被实例化的,它只能被子类继承作为超类使用.抽象类被用作它的子类下的层次结构创建模板(Abstract classes are used to c

java中抽象类与接口的区别

转自: http://blog.csdn.net/tp7309/article/details/10452445 二者的区别快忘得差不多了,从别处看到这文章感觉写的不错,正好复习复习,也给大家分享一下. 抽象类 abstract class 包含抽象方法的类,叫抽象类.而抽象的概念就是抽象出共同属性:成员变量和方法.所以抽象类可以有private等多种权限的成员变量和非abstract的成员方法.当然抽象方法是一定要有的. 抽象类是用于单一继承的,不能实例化.而继承类一定要实现抽象方法,因为抽象

我如何理解Java中抽象类和接口

在面试中我们经常被问到:Java中抽象类和接口的区别是什么? 然后,我们就大说一通抽象类可以有方法,接口不能有实际的方法啦:一个类只能继承一个抽象类,却可以继承多个接口啦,balabala一大堆,就好像把标准答案熟练的说出来一样. 抽象类和接口这篇文章讲到了他们的区别和联系,它们确实有很多相似的地方,但是从本质上看,或从语言的设计角度来看,这不是它们最本质的区别. 不卖关子,我个人对这两个的理解: 类是具体实例的抽象,比如一个json字符串的抽象:而抽象类就是类的抽象:接口就是抽象类的抽象,接口

C#中抽象类和接口的区别

原文:C#中抽象类和接口的区别 大家在编程时都容易把抽象类和接口搞混,下面为大家从概念上讲解抽象类和接口的区别: 一.抽象类: 含有abstract修饰符的class即为抽象类,抽象类是特殊的类,只是不能被实例化,可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例:除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法,这是普通类所不能的.抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们.另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖.

C#中抽象类和接口的区别与使用

一.抽象类: 抽象类是特殊的类,只是不能被实例化:除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法,这是普通类所不能的.抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们.另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们. 二.接口: 接口是引用类型的,类似于类,和抽象类的相似之处有三点: 1.不能实例化: 2.包含未实现的方法声明: 3.派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括

抽象类与接口的异同

抽象类和接口是java中非常重要的两个概念,是java多态的基础,在java的设计模式中他们无处不在,为了归纳记忆,我们总结下抽象类和接口的相同和不同之处. 我们先说说他们各自的特点: 接口: 1.接口不是一个类,这点从声明就可以看出来声明关键字为interface 而类的声明是class,但是接口是一种抽象类型. 2.接口不能被实例化,因此接口中也不能有构造器. 3.接口中的方法默认是public abstract 类型的,且不能由其他private 等修饰符修饰. 4.接口中的方法如果不是s

java中抽象类与接口中方法访问修饰符问题 (

1.抽象类中的抽象方法(其前有abstract修饰)不能用private.static.synchronized.native访问修饰符修饰.原 因如下:抽象方法没有方法体,是用来被继承的,所以不能用private修饰:static修饰的方法可以通过类名来访问该方法(即该方法的方法体),抽 象方法用static修饰没有意义:使用synchronized关键字是为该方法加一个锁..而如果该关键字修饰的方法是static方法.则使用的锁 就是class变量的锁.如果是修饰 类方法.则用this变量锁

Java中抽象类和接口的区别(读书笔记)

Java的抽象类和接口 抽象类和接口是两个容易混淆的概念,但有一句话能很好地将这两者区分开来,即抽象类是事物的抽象,而接口是行为的抽象.抽象类抽象出来的是一类事物,事物中包含了一些固有的属性和行为,而接口更多的是提供固有属性行为之外的延伸行为.打个比方,可以把动物看成为抽象类,类中有一些固有属性,如身高体重,还有一些共有行为,如吃饭和睡觉,所有的动物都遵循着这些属性和行为.除此之外,有些动物还能飞,但并不是所有的动物都具有飞行这种能力,此时飞行只是事物的延伸功能,相当于一个接口. 一.抽象类 抽

java中抽象类和接口的用法和区别

一.抽象类 1.抽象类 包含一个抽象方法的类就是抽象类 2.抽象方法 声明而未被实现的方法,抽象方法必须使用abstract关键词字声明 public abstract class People { //关键词abstract,声明该类为抽象类 public int age; public void Num() { } public abstract Name(); //声明该方法为抽象方法 } 3.抽象类被子类继承,子类(如果不是抽象类)必须重写抽象类中的所有抽象方法 4.抽象类不能被直接实例