3.继承
所有面向对象的编程语言都允许用户从现有的一个类出发来定义一个新的类。这项技术就叫做继承。继承是面向对象语言最重要的特性之一。继承最突出的特点就是代码的可重用性。
继承是指把一个新的类定义为已经存在的类的后代。新类继承父类的大部分内容,也可以添加新的内容。父类的字段和方法存在于子类中,子类继承父类的属性、字段、方法和事件。子类还可以添加新的成员。
生活中的继承:
在上面的图中,兔子和羊属于食草动物类,狮子和豹属于食肉动物类。食草动物和食肉动物又是属于动物类。在继承关系中,父类更通用,子类更具体。虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。
下面在Delphi中描述这种关系:
Type TAnimal = Class(TObject) private id: integer; name: string; age: integer; public constructor Create(_id: integer; _name: string; _age: integer); procedure SetId(_id: integer); procedure SetName(_name: string); procedure SetAge(_age: integer); function GetId(): integer; function GetName(): string; function GetAge(): integer; procedure eat(); End; Constructor TAnimal.Create(_id: integer; _name: string; _age: integer); begin id := _id; name := _name; age := _age; end; procedure TAnimal.SetId(_id: Integer); begin id := _id; end; procedure TAnimal.SetName(_name: string); begin name := _name; end; procedure TAnimal.SetAge(_age: Integer); begin age := _age; end; function TAnimal.GetId; begin GetId := id; end; function TAnimal.GetName; begin GetName := name; end; function TAnimal.GetAge; begin GetAge := age; end; procedure TAnimal.eat; begin writeln('正在吃......'); end; Type TPenguin = class(TAnimal) public procedure eat(); end; procedure TPenguin.eat; begin writeln(name + '正在吃......'); end; Type TMouse = class(TAnimal) public procedure eat(); end; procedure TMouse.eat; begin writeln(name + '正在吃......'); end; var a: TAnimal; p: Tpenguin; m: Tmouse; begin a := TAnimal.Create(0, '动物', 1); p := TPenguin.Create(1, '企鹅', 2); m := TMouse.Create(2, '老鼠', 1); a.eat; p.eat; m.eat; end.
运行结果:
正在吃...... 企鹅正在吃...... 老鼠正在吃......
在上面的代码中,定义了TAnimal类,其父类是TObject,包括3个属性、1个构造函数和7个方法。接下来在定义子类的时候就变得相对简单多了,只需要定义子类中的内容,本例在子类中只是对 eat 方法进行了重写。
继承有很多优点,但也有缺点,比如:对于父类中的字段,如果子类不需要怎么办?可以说没有办法,只能不去使用它就可以了。