delphi – 继承的类覆盖虚拟方法依赖

前端之家收集整理的这篇文章主要介绍了delphi – 继承的类覆盖虚拟方法依赖前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这两个班:
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;

猜你在找的Delphi相关文章