delphi – 继承的类覆盖虚拟方法依赖
发布时间:2020-12-15 04:22:05 所属栏目:大数据 来源:网络整理
导读:我有这两个班: type TMyBaseClass = class protected FAllowDoSomething: Boolean; // initialized to False procedure DoSomething; virtual; end; TMyChildClass = class(TMyBaseClass) protected procedure DoSomething; override; end;implementationpr
|
我有这两个班:
type
TMyBaseClass = class
protected
FAllowDoSomething: Boolean; // initialized to False
procedure DoSomething; virtual;
end;
TMyChildClass = class(TMyBaseClass)
protected
procedure DoSomething; override;
end;
implementation
procedure TMyBaseClass.DoSomething;
begin
if not FAllowDoSomething then Exit; // Abort;
ShowMessage('TMyBaseClass: FAllowDoSomething is False. You wont see me!');
end;
procedure TMyChildClass.DoSomething;
begin
inherited; // Must inherit
// if not FAllowDoSomething then Exit; { I don't want to check here again }
ShowMessage('TMyChildClass: FAllowDoSomething is False but still I can see this message!');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
with TMyBaseClass.Create do try
DoSomething;
finally
Free;
end;
// if I use Abort in TMyBaseClass,the code will not get here
with TMyChildClass.Create do try
DoSomething;
finally
Free;
end;
end;
在TMyChildClass.DoSomething中,我必须继承TMyBaseClass.DoSomething,但是我希望它遵守如果不是FAllowDoSomething然后<不做任何>. 我试过在TMyBaseClass中使用Abort,但是我意识到这不是一个好主意,并且会打破调用方法(TForm1.Button1Click); 这样做的正确方法是什么,没有写入,如果不是FAllowDoSomething然后再次退出在TMyChildClass. 解决方法
关键是在基类中对boolean执行一次检查.所以,使DoSomething非虚拟,并在您的基类中实现它,如下所示:
procedure TMyBaseClass.DoSomething;
begin
if FAllowDoSomething then
DoSomethingImplementation;
end;
其中DoSomethingImplementation是您在派生类中重写的虚拟方法. 基础类似如下: type
TMyBaseClass = class
private
FAllowDoSomething: Boolean;
protected
procedure DoSomethingImplementation; virtual;
public
procedure DoSomething;
end;
你的派生类看起来像这样: type
TMyDerivedClass = class(TMyBaseClass)
protected
procedure DoSomethingImplementation; override;
end;
您重写的方法如下所示: procedure TMyDerivedClass.DoSomethingImplementation; begin inherited; ShowMessage(...); end; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
