我有这两个班:
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);
解决方法
关键是在基类中对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;