使用abstract关键字修饰的类叫做抽象类。父类无法确定子类行为时可以定义为抽象类
抽象类特点:
- 抽象类不能被实例化,主要用于被继承;抽象类里可以包含两种抽象成员,分别是抽象方法声明和抽象属性,同时可以包含其他非抽象成员。也可以包含构造函数,虽然不能被实例化
- 如果继承抽象类,则需实现抽象类中的所有抽象成员;如果子类也是一个抽象类,则可以不重写
- 不能使用Sealed关键字修饰抽象类,因为Sealed意味着不能被继承,同样Static也不能用于修饰抽象类,因为Static意味着会有一个实例
- 抽象成员的访问修饰符不能是private
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 //抽象类不允许创建对象
6 Animal a = new Cat(); //new Dog();
7 a.Bark();
8 Console.ReadKey();
9 }
10 }
11
12 abstract class Animal
13 {
14 public abstract void Bark();
15 }
16
17 class Dog : Animal
18 {
19
20 public override void Bark()
21 {
22 Console.WriteLine("狗狗旺旺的叫");
23 }
24 }
25
26 class Cat : Animal
27 {
28 public override void Bark()
29 {
30 Console.WriteLine("猫咪喵喵的叫");
31 }
32 }
接口的抽象类的相同点和区别
相同点:
- 接口和抽象类都不能实例化
- 接口和抽象类都包含未实现的方法
- 接口和抽象类都可以被子类继承
- 子类必须实现接口的接口成员和抽象类的抽象成员
区别:
- 抽象类只能继承自一个基类;接口可以继承自多个接口
- 抽象类可以包含字段、属性、方法;接口只能包含属性,方法,索引器,事件,不能包含字段,构造函数、析构函数和静态成员或常量
- 抽象类可以包含抽象方法和实例方法;接口只包含抽象方法,不能有方法实现。
- 抽象类抽象成员必须显式用public修饰;接口默认为public,且不用public修饰,接口方法不能用abstract或者virtual修饰