I have these 2 classes:
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;
In TMyChildClass.DoSomething I must inherited the TMyBaseClass.DoSomething but I want it to respect the if not FAllowDoSomething then <don't do anything>.
I have tried using Abort in the TMyBaseClass but I realize it's not a good idea and will break the calling method (TForm1.Button1Click);
What is the correct approach of doing this, without writing the if not FAllowDoSomething then Exit again in TMyChildClass.
The key point is to perform the check on the boolean once, in the base class. So, make DoSomething non-virtual and implement it in your base class like this:
procedure TMyBaseClass.DoSomething;
begin
if FAllowDoSomething then
DoSomethingImplementation;
end;
where DoSomethingImplementation is a virtual method that you override in your derived classes.
The base class then looks like this:
type
TMyBaseClass = class
private
FAllowDoSomething: Boolean;
protected
procedure DoSomethingImplementation; virtual;
public
procedure DoSomething;
end;
Your derived class looks like this:
type
TMyDerivedClass = class(TMyBaseClass)
protected
procedure DoSomethingImplementation; override;
end;
Your overridden method looks like this:
procedure TMyDerivedClass.DoSomethingImplementation;
begin
inherited;
ShowMessage(...);
end;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With