写点什么

知识回顾:抽象类与抽象方法

作者:喵叔
  • 2021 年 12 月 28 日
  • 本文字数:1438 字

    阅读完需:约 5 分钟

今天说一个老生常谈的知识:抽象类与抽象方法。这两个内容在面试中经常被问到,对于老程序员来说会打起来没什么难度,但是对于新手程序员来说就有些难多了,那么这篇文章就来讲解一下抽象类和抽象方法。C#允许把类和方法声明为抽象类与抽象方法,声明方法是在类名或方法名前加上 abstract 关键字。定义很简单,但是你有没有想过什么时候应该用抽象类呢?要回答这个问题只需记住一点:如果类设计的目点是用来被其它类继承,并且它代表的是一系列类对象所具有的公共属性或方法,那么这个类应该设置为抽象类。下面我们再来看另一个问题:抽象类与普通类有什么区别。首先抽象类不能够被实例化。如果类中包含有抽象方法,那么这个类必须要声明为抽象类。同时抽象方法必须在子类中重写。例如我们要声明一个用户类 User,这个类里定义了公用的方法,然后有其它类来继承它并实现自己的方法,那么这个用户类应该声明为抽象类。因为 User 是一个名词不代表具体的对象,只是代表所有用户所拥有的共同特征,因此 User 类不可能被实例化。同时如果所有用户都必须声明 Login 方法的话,那么可以在 User 类中声明一个抽象方法 Login,让所有继承自 User 的类都去重写 Login 方法。案例代码如下:


//声明抽象类Userabstract class User {  //声明抽象方法Login,所有继承User类的子类都必须重写Login()方法  protected abstract void Login(); }//声明Emplyee类,继承自User类class Emplyee:User{  protected override vod Login()  {    //more code  }}
复制代码


抽象类和接口好多人会弄混,下面我们就来看看接口和抽象类的区别。


  1. 接口接口是指对协定进行定义的引用类型,其他类型实现接口以保证它们支持某些操作。接口指定必须由类提供的成员或实现它的其他接口。与类相似接口可以包含方法、属性、索引器和事件作为成员。以下是接口的定义:


  • 接口是为了实现多态;

  • 接口只能包含方法、属性、事件、索引;

  • 接口成员不能有任何实现;

  • 接口不能被实例化;

  • 接口成员不能有访问修饰符,默认为 public;

  • 实现接口的子类必须实现接口所有成员函数;

  • 子类实现接口方法时不需要任何关键字,直接实现即可。


  1. 抽象类在面向对象过程中所有的对象都是类描绘的,类里面的数据不足以把具体的对象描绘出来,这样的类就是抽象类,下面是抽象类的定义:


  • 抽象方法只能出现在抽象类中,但是抽象类中可以包含普通方法;

  • 抽象类不能实例化;

  • 抽象类与抽象方法需要添加 abstract 关键字;

  • 子类实现父类的抽象方法时需添加 override 关键字;

  • 如果抽象类的子类不是抽象类,那么子类中必须重写父类抽象类的所有抽象方法。


  1. 抽象类和接口异同


  • 同不能实例化、包含未实现的方法声明、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员。

  • 异接口可以多继承,抽象类不能实现多继承、接口只能定义抽象规则,抽象类既能定义抽象规则也能提供已实现的成员、接口是一组行为规范,抽象类是一个不完全的类,着重于族的概念、接口支持回调,抽象类不能实现回调、接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法,抽象类可以定义属性、字段、包含有实现的方法、接口可以作用于值类型和引用类型,抽象类只能作用于引用类型、抽象类主要用于关系密切的对象,而接口则是适合为不相关的类提供通用功能、接口着重于 Can-Do 关系类型,抽象类则偏重于 IS-A 式关系、接口定义对象的行为,抽象类定义对象的属性、如果要设计小而简练的功能块,则使用接口,如果要设计大的功能单元,则使用抽象类、接口对应的是面向对象编程思想的重要原则:面向接口编程。

用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
知识回顾:抽象类与抽象方法