Inherited是一种调用父类的巧妙的实现,这个实现和Object pascal遵循相同的规则。由于tsl支持多重继承,因而Inherited会优先调用第一个继承的父类,如果没找到则会遍历之后继承的类。
Inherited和java的super有一定的类似之处,但又不相同, java的super可以表达成父类,也可以调用父类的方法,而Inherited都是调用父类的方法,而且单独Inheritd的写法,在父类不存在方法的时候不会出错,这样的特性非常便于桌面应用开发里的子类窗口的消息事件响应。
用法有两种:
方式一:在方法中,增加
inherited;则表示执行父类中存在的与当前方法名同名同参数的方法,若父类中查找不到,不报错,即什么也不做,继续向下执行。
方式二:使用如
inherited func(a,b,c);的模式调用方法,表示调用父类中的该方法,若存在多父类,则按顺序查找,若父类中查找不到,则报错。
例如:
Type Base1 =Class
Function Method1(s,a,b); virtual;
Begin
s:=s$"-Base1-Method1-"$(a+b);
End;
Function Method2(a,b);
begin
return "Base1-Method2-"$(a*b);
end;
End;
Type SubClass =Class(Base1)
Function Method1(s,a,b); override;
Begin
Inherited; //优先调用父类中Method1(s,a,b)方法,找不到不报错
s:=s+"->SubClass";
s2:=Inherited Method2(a,b);//指定调用父类中的Method2(a,b)方法,找不到会报错
s:=s+"->"+s2;
return s;
End;
Function Method2(a,b);
begin
return "SubClass-Method2-"$(a/b);
end;
End;
调用:
obj:=new SubClass();
return obj.Method1("S",2,50);
返回结果为:S-Base1-Method1-52->SubClass->Base1-Method2-100
即:Inherited;语句执行父类Base1中同名同参数方法Method1(s,a,b)
Inherited Method2(a,b);执行父类Base1中指定方法Method2,而非当前类SubClass的Method2方法