继承,就是面向对象中类与类之间的一种关系。继承的类称为子类、派生类,而被继承类称为父类、基类或超类。通过继承,使得子类具有父类的属性和方法,同时子类也可以通过加入新的属性和方法或者修改父类的属性和方法建立新的类层次。 继承机制体现了面向对象技术中的复用性、扩展性和安全性。
为面向对象软件开发与模块化软件架构提供了最基本的技术基础。
在.NET中,继承按照其实现方式的不同,一般分类如下。
— 实现继承:派生类继承了基类的所有属性和方法,并且只能有一个基类,在.NET中System.Object是所有类型的最终基类,这种继承方式称为实现继承。
— 接口继承:派生类继承了接口的方法签名。不同于实现继承的是,接口继承允许多继承,同时派生类只继承了方法签名而没有方法实现,具体的实现必须在派生类中完成。因此,确切地说,这种继承方式应该称为接口实现。
CLR支持实现单继承和接口多继承。另外,值得关注的是继承的可见性问题,.NET通过访问权限来实现不同的控制规则,这些访问修饰符主要包括:public、protected、internal和private。
— 继承是可传递的,子类是对父类的扩展,必须继承父类方法,同时可以添加新方法。
— 子类可以调用父类方法和字段,而父类不能调用子类方法和字段。
— 虚方法如何实现覆写操作,使得父类指针可以指向子类对象成员。
— 子类不光继承父类的公有成员,同时继承了父类的私有成员,只是在子类中不被访问。
— new关键字在虚方法继承中的阻断作用。
实现继承与接口继承
实现继承通常情况下表现为对抽象类的继承,而其与接口继承在规则上有以下几点归纳:
— 抽象类适合于有族层概念的类间关系,而接口最适合为不同的类提供通用功能。
— 接口着重于CAN-DO关系类型,而抽象类则偏重于IS-A式的关系。
— 接口多定义对象的行为;抽象类多定义对象的属性。
— 如果预计会出现版本问题,可以创建“抽象类”。例如,创建了狗(Dog)、鸡(Chicken)和鸭(Duck),那么应该考虑抽象出动物(Animal)来应对以后可能出现马和牛的事情。而向接口中添加新成员则会强制要求修改所有派生类,并重新编译,所以版本式的问题最好以抽象类来实现。
— 因为值类型是密封的,所以只能实现接口,而不能继承类。