继承就是面向对象类与类之间的一种关系,继承的类称为子类、派生类,而被继承类称为父类、基类或超类。通过继承,使得子类具有父类的属性与方法,同时子类也可以通过加入新的属性或方法或者修改父类的属性和方法建立新的类层次。继承机制体现了面向对象技术中的复用性、拓展性和安全性。
在.Net中,继承按照实现方式的不同,一般分类如下:
1:实现继承:派生类继承了所有基类的属性和方法,并且只有一个基类,在.Net中System.Object是所有类型的最终基类,这种继承方式称为实现继承。
2:接口继承:派生类继承了接口的方法签名,不同于实现继承的是,接口继承允许多继承,同时派生类只继承了方法签名而没有实现方法实现,具体的实现必须在派生类中完成。因此,确切的说这种继承方式应该称为接口实现。
同时,子类也可以实现基类的拓展和改写,主要有两种方式:
1:是通过在子类中添加新方法,例如在Bird类中添加了新方法ShowColor用于实现鸟类的毛色
2:是通过对父类方法的覆写。
using System; namespace ConsoleApp1 { public abstract class Animal { public abstract void ShowType(); public void Eat() { Console.WriteLine("Animal always eat"); } } public class Bird : Animal { private string type = "Bird"; public override void ShowType() { throw new NotImplementedException(); } private string color; public string Color { get { return color; } set { color = value; } } } public class Chicken : Bird { private string type = "Chicken"; public override void ShowType() { base.ShowType(); } public void ShowColor() { Console.WriteLine("Color is {0}",Color); } } class Program { static void Main(string[] args) { Bird bird = new Bird(); Chicken chiken = new Chicken(); } } }
继承的本质:
继承是可传递的,子类是对父类的拓展,必须继承父类的方法,同时可以添加新方法。
子类可以调用父类方法和字段,而父类不能调用子类方法和字段。
实现继承与接口继承:
实现继承通常表现为对抽象类的继承
抽象类适用于有族层概念的类间关系,而接口最适合为不同的类提供通用功能。
接口着重于CAN-DO关系类型,而抽象类则偏重于IS-A的关系。
接口多定义对象的行为,抽象类多定义对象的属性。
类与类之间的关系,通常以耦合度来描述,也就是类与类之间的依赖关系程度。因此,类与类、模块与模块、系统与系统之间或多或少要发生互相交互,设计应力求将类与类之间的耦合关系降到最低。
继承之缺点:
继承可能造成子类的无线膨胀,不利于类体系的维护与安全。
随着继承层次的复杂化和子类的多样化,不可避免的会出现对父类的无效继承或者有害继承,从而造成系统设计的漏洞与失衡。
解决方法:
多聚合,少继承。
低耦合,高内聚。