第5篇 抽象
一 抽象类
描述一个事物,由于没有足够的信息,这时就将这个事物称为抽象事物。abstract为抽象关键字,被其声明的类称为抽象类,其声明的方法称为抽象方法。
抽象属性声明不提供属性访问器的实现,它只声明该类支持的属性,而访问器的实现留给派生类。
抽象方法声明不提供方法的实现,他必须是一个空方法,而将方法实现留给派生类。派生类必须重载抽象基类的抽象方法。
抽象类是用来作为基类的,不能直接实例化,即不能用抽象类去创建对象。抽象类的用途是提供多个派生类可共享的基类公共定义。抽象类特点:
- 抽象类用abstract声明,不能被实例化(不能new)。
- 只有当子类覆盖了所有的抽象方法后,子类才可以创建对象,如果没有覆盖所有抽象方法,那么子类还是一个抽象类。
- 抽象类也是不断向上抽取而来的,抽取了方法声明儿不确定具体的方法内容。由不同的子类完成具体的方法。
- 抽象类可以包含抽象的成员,如抽象属性和抽象方法,也可以包含非抽象的成员,甚至还可以包含虚方法。注意:没有抽象字段,字段是不可以抽象的。
二 几个关于抽象类的问题
1.抽象类中有构造函数吗?
有。抽象类的构造函数虽然不能给抽象类对象实例化,因为抽象类不能创建对象,但是抽象类有子类,抽象类的构造函数可以用于子类对象实例化。
2.抽象类一定是个父类吗?
是的。必须需要子类覆盖抽象方法才能实例化,使用这些方法。
3. 抽象类中可以不定义抽象方法吗?
可以的。
4. 抽象关键字abstract和哪些关键字不能共存?
sealed,private,static.一是因为抽象类不能是密封或者静态的。二是因为虚拟成员和抽象成员不能私有
三 抽象类与接口的区别
- C#支持单继承,不直接支持多继承(接口可以多继承)。它们的派生类只能继承一个抽象类,但是可以实现多个接口。即单继承,多实现。
- 抽象类中可以包含字段,构造函数,析构函数,静态成员或者常量等,但是接口中不可以。
- 抽象类中可以定义非抽象成员的实现,但是接口中不能定义任何实现。
- 抽象类中的成员可以私有的(只要是不抽象的),受保护的,内部的或者受保护的内部成员,但是接口中的成员必须是公共的。
备注:关于接口的内容请看“第6篇 接口”