CS3L19——抽象类和抽象方法

本章代码关键字

1
abstract    //抽象类和抽象方法的关键字

抽象类

抽象类就是,被抽象关键字 abstract​ 修饰的类

特点:不能被实例化的类,可以包含抽象方法,继承抽象类必须重写其抽象方法

作用:整体框架设计时会使用

注意:选择普通类还是抽象类,对于不希望被实例化的对象,相对比较抽象的类可以使用抽象类
父类中的行为不太需要被实现的,只希望在子类去定义具体的规则,可以选择,抽象类然后使用其中的抽象方法类定义规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 物品就是一种抽象的概念,它不是具体的物质,而是一个统称
abstract class Thing
{
//抽象类中 封装的所有知识点都可以在其中书写
public string name;
//还可以抽象类中写抽象函数
}

class Water : Thing { }

internal class Program
{
static void Main(string[] args)
{
//抽象类不能被实例化
//Thing t = new Thing();
Thing t = new Water(); //但是遵循里氏替换原则,可以用父类装子类
}
}

抽象方法

抽象方法,又称为 纯虚方法,用 abstract​ 关键字修饰的方法
特点:只能在抽象类中申明,没有方法体,不能是私有的,继承后必须实现,用 override​ 重写

因为不写访问修饰符的方法默认是私有的,而抽象方法不能是私有的,所以抽象方法必须加访问修饰符
抽象方法 是一定不能有函数体的 不能加 {}​ ,直接用 ;​ 结束

继承了抽象类的类必须要实现抽象类中的所有抽象方法,并用 override​ 重写
同时子类里父类的虚方法是选择性实现的,抽象方法一定要实现

虚方法和抽象方法都可以被子类无限的重写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 水果就是一种抽象的概念,它不是具体的物品,而是一个统称
abstract class Fruits
{
public string name;
//因为不写访问修饰符默认是私有的,而抽象方法不能是私有的,所以抽象方法必须加访问修饰符
//抽象方法 是一定不能有函数体的 不能加 { } ,直接用 ; 结束
public abstract void Bad();

public virtual void Test()
{
//可以选择是否写逻辑
}
}

//继承了抽象类的类必须要实现抽象类中的所有抽象方法,并用override重写
//可以点击灯泡图标的实现抽象类以自动填写所有需要写的抽象方法
class Apple : Fruits
{
public override void Bad()
{
//这是会丢出一个没有写函数的提示的代码,默认会添加
//throw new NotImplementedException();
}
//同时子类里父类的虚方法是选择性实现的,抽象方法一定要实现
}

class SuperApple : Apple
{
//子类的子类没必要再次重写父类的抽象方法,但仍然可以选择重写
public override void Bad()
{
base.Bad();
}

public override void Test()
{
base.Test();
}
//虚方法和抽象方法都可以被子类无限的重写
}