C# 中的“抽象类”,“抽象方法”

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_42351033/article/details/86584647

先看一句话
C#允许把类和方法声明为abstract,即抽象类和抽象方法。
抽象类通常代表一个抽象的概念,他提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的。所以在一个继承关系形成的等级结构中,树叶节点应当为具体类,而树枝节点均应当为抽象类。–摘自《大话设计模式》

这是比较官方的说法,下面用我自己的语言来描述下
1:什么是抽象类、抽象方法
在 C# 中,使用关键字 abstract 来定义抽象类和抽象方法。

2:抽象类的特性
抽象类是一种特殊的基础类,并不与具体的事物联系。它有以下特性
1):抽象类不能实例化
验证如下:

public abstract class Car
{

}

在这里插入图片描述
2):抽象类可以包含抽象方法和抽象访问器
验证代码如下:

//抽象方法
public abstract void Run();
//抽象访问器
public abstract string Name { get; }

3):不能用 sealed 修饰符修改抽象类,因为这意味着抽象类将不能被继承(通常情况下,我们会把抽象类视为公共基类)
验证如下:
在这里插入图片描述
4):从抽象类派生的非抽象类,必须包括继承的所有抽象方法和抽象访问器的实现
验证如下:
在这里插入图片描述
3:抽象方法的特性
一个抽象方法通俗易懂的说就是一个没有方法体的方法。它有以下特性
1):抽象方法是隐式的虚方法。
2):只允许在抽象类使用抽象方法声明。
3):因为抽象方法声明不提供实际的实现,所有没有方法体。方法声明只是以一个分号结束,并且在签名后没有大括号,实现由一个重写方法提供,此重写方法是非抽象类的成员。
4):在抽象方法声明中使用static或virtual修饰符是错误的。
5):除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。
6):在静态属性上使用abstract修饰符是错误的。
7):在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。
下面两种抽象方法的写法都是可以的

//抽象方法
public abstract void Run();
abstract public void Stop();

只不过将 abstract 放到访问修饰符前面时会提示你“修饰符声明顺序不一致”,但这样写也没错,只不过我喜欢第一种写法,看着舒服。
另外,抽象方法不能设置为私有的(因为抽象方法写出来就是为了子类继承实现的)
验证如下
在这里插入图片描述

4:抽象方法与抽象类之间的关系
有抽象方法的类必然是抽象类,
但是,抽象类中的方法并不一定都是抽象方法。

5:抽象类与一般类的相同点及不同点
相同点:
都可以继承其它的类或者接口,也可以派生子类,并且都有具体的方法;
不同点:
抽象类中有抽象方法,一般类中没有;
抽象类不可以实例化,一般类却可以;

明天写个抽象类的应用实例,今天就写到这吧,劳逸结合,嘿嘿。

没有更多推荐了,返回首页