什么是抽象类?
- 所谓抽象类,就是只声明方法的存在而不去具体实现它的类。抽象类不能被实例化,也就是说,不能创建抽象类的对象。在定义抽象类时,需要在关键字 class 前面添加关键字 abstract。
- 抽象类是表示抽象概念的特殊类。如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为派生类的一个基类,这样的类就是抽象类。抽象类使用关键字abstract来定义,抽象类不能被实例化,一个抽象类可以同时包含抽象方法和非抽象方法。比如说动物是抽象的,狗是具体的。
- abstract关键字可以和类、方法、属性、索引器及事件一起使用。
抽象类有什么样的特性?
抽象类不能直接实例化。并且对抽象类使用new运算符是编译时错误。虽然一些变量和值在编译时的类型可以是抽象的,但是这样的变量和值为null,或者含有对非抽象类的实例的引用(此非抽象类是从抽象类派生的)。
抽象类可以包含抽象方法和抽象访问器,但是非抽象类不可以。
不能用sealed关键字修改抽象类,如果使用了sealed关键字意味着该类不能被继承。
从抽象类派生的非抽象类必须重写所有抽象方法和抽象访问器。
抽象类的声明
[访问修饰符] abstract class 类名
{
类成员;
}
抽象类的作用
- 类可以实现无限个接口,但仅能从一个抽象(或者其他类型)类继承,从抽象类派生的类仍可实现接口,从而得出接口时用来处理多重继承问题的。
- 抽象类中可以存在非抽象方法,可接口不能,且接口里面的方法只是一个声明必须用public来修饰,没有具体实现方法。
- 抽象类中的成员变量可以被不一样的修饰符来修饰,可接口中的成员变量默认的都是静态常量(staticfinal)
- 抽象类是对象的抽象,接口是一种行为规范。
抽象类的使用场景
- 如果一个类设计的目点是用来被其它类继承的,它代表一类对象的所具有的公共属性或方法,那个这个类就应该设置为抽象类。
- 在实现接口时,常写一个抽象类,来实现接口中的某些子类中所需的通用方法,接着在编写各个子类时,即可继承该抽象类来用。省去在每一个都要实现通用的方法的困扰。
抽象方法的概念
在抽象类中也可以使用关键字abstract定义抽象方法,要求所有的派生非抽象类都要重写实现抽象方法,引入抽象方法的原因在于抽象类本身是一种抽象概念,有的方法并不需要具体实现,而是留下来让派生类重写实现。抽象类中也可以声明正常方法。也就是说抽象方法不能有方法体,抽象类中的所有抽象方法必须在子类中重写override。
抽象方法有什么样的特性?
- 抽象方法是隐式的virtual方法(虚方法)。
- 只允许在抽象类中使用抽象方法声明。
因为抽象方法声明不提供实实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。 - 实现由overriding方法提供,它是非抽象类的成员。
- 在抽象方法声明中使用static或virtual修饰符是错误的。
5)除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。在静态属性上使用abstract修饰符是错误的。 - 在派生类中,使用override修饰符的属性声明可以重写抽象类的继承属性。
抽象方法的声明
注意:抽象方法必须声明在抽象类中;声明抽象方法时,不能使用virtual、static、private修饰符;在方法或属性声明中使用abstract修饰符以指示此方法或属性不包含实现,方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。
[访问修饰符] abstract 返回值类型 方法名();
实例①:
//当从抽象类派生非抽象类时,这些非抽象类必须具体实现所继承的所有抽象成员,从而重写那些抽象成员。