知识回顾:抽象类与抽象方法
今天说一个老生常谈的知识:抽象类与抽象方法。这两个内容在面试中经常被问到,对于老程序员来说会打起来没什么难度,但是对于新手程序员来说就有些难多了,那么这篇文章就来讲解一下抽象类和抽象方法。C#允许把类和方法声明为抽象类与抽象方法,声明方法是在类名或方法名前加上 abstract 关键字。定义很简单,但是你有没有想过什么时候应该用抽象类呢?要回答这个问题只需记住一点:如果类设计的目点是用来被其它类继承,并且它代表的是一系列类对象所具有的公共属性或方法,那么这个类应该设置为抽象类。下面我们再来看另一个问题:抽象类与普通类有什么区别。首先抽象类不能够被实例化。如果类中包含有抽象方法,那么这个类必须要声明为抽象类。同时抽象方法必须在子类中重写。例如我们要声明一个用户类 User,这个类里定义了公用的方法,然后有其它类来继承它并实现自己的方法,那么这个用户类应该声明为抽象类。因为 User 是一个名词不代表具体的对象,只是代表所有用户所拥有的共同特征,因此 User 类不可能被实例化。同时如果所有用户都必须声明 Login 方法的话,那么可以在 User 类中声明一个抽象方法 Login,让所有继承自 User 的类都去重写 Login 方法。案例代码如下:
抽象类和接口好多人会弄混,下面我们就来看看接口和抽象类的区别。
接口接口是指对协定进行定义的引用类型,其他类型实现接口以保证它们支持某些操作。接口指定必须由类提供的成员或实现它的其他接口。与类相似接口可以包含方法、属性、索引器和事件作为成员。以下是接口的定义:
接口是为了实现多态;
接口只能包含方法、属性、事件、索引;
接口成员不能有任何实现;
接口不能被实例化;
接口成员不能有访问修饰符,默认为 public;
实现接口的子类必须实现接口所有成员函数;
子类实现接口方法时不需要任何关键字,直接实现即可。
抽象类在面向对象过程中所有的对象都是类描绘的,类里面的数据不足以把具体的对象描绘出来,这样的类就是抽象类,下面是抽象类的定义:
抽象方法只能出现在抽象类中,但是抽象类中可以包含普通方法;
抽象类不能实例化;
抽象类与抽象方法需要添加 abstract 关键字;
子类实现父类的抽象方法时需添加 override 关键字;
如果抽象类的子类不是抽象类,那么子类中必须重写父类抽象类的所有抽象方法。
抽象类和接口异同
同不能实例化、包含未实现的方法声明、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员。
异接口可以多继承,抽象类不能实现多继承、接口只能定义抽象规则,抽象类既能定义抽象规则也能提供已实现的成员、接口是一组行为规范,抽象类是一个不完全的类,着重于族的概念、接口支持回调,抽象类不能实现回调、接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法,抽象类可以定义属性、字段、包含有实现的方法、接口可以作用于值类型和引用类型,抽象类只能作用于引用类型、抽象类主要用于关系密切的对象,而接口则是适合为不相关的类提供通用功能、接口着重于 Can-Do 关系类型,抽象类则偏重于 IS-A 式关系、接口定义对象的行为,抽象类定义对象的属性、如果要设计小而简练的功能块,则使用接口,如果要设计大的功能单元,则使用抽象类、接口对应的是面向对象编程思想的重要原则:面向接口编程。
评论