Конструктор Delphi как (наследовать создание Parent.Parent) или (вызвать Parent.Parent.Create) - PullRequest
0 голосов
/ 30 мая 2019

Привет, я пытаюсь вызвать parent.create родителя, фактически обойдя parent.create

. Вот пример

unit InheritedTest;

interface

  type
  IMyExample = interface
    ['{4B281573-99CC-4B9D-9895-F6BCD0E26F26}']
    procedure Set_MyMessage(const Value: String);
    function Get_MyMessage: String;
    property _MyMessage: String read Get_MyMessage write Set_MyMessage;
  end;

  TMyExample1 = class(TInterfacedObject, IMyExample)
  protected
    fMyMessage: String;
    procedure Set_MyMessage(const Value: String);
    function Get_MyMessage: String;
  published
    property _MyMessage: String read Get_MyMessage write fMyMessage;
    constructor Create();
  end;

  TMyExample2 = class( TMyExample1)
    constructor Create();
  end;

  TMyExample3 = class( TMyExample2)
    constructor Create();
    constructor CreateBypassingTMyExample2Create();
  end;

implementation

{ TMyExample1 }

constructor TMyExample1.Create();
begin
  inherited;
  fMyMessage := 'TMyExample1';
end;

function TMyExample1.Get_MyMessage: String;
begin
  Result := fMyMessage;
end;

procedure TMyExample1.Set_MyMessage(const Value: String);
begin
  fMyMessage := Value;
end;

{ TMyExample2 }

constructor TMyExample2.Create;
begin
  inherited;
  fMyMessage := fMyMessage + ' TMyExample2';
end;

{ TMyExample3 }

constructor TMyExample3.Create;
begin
  inherited;
  fMyMessage := fMyMessage + ' TMyExample3.1';
end;

constructor TMyExample3.CreateBypassingTMyExample2Create;
begin
  //inherited TMyExample1.Create;
  inherited ClassParent.Create;
  fMyMessage := fMyMessage + ' TMyExample3.2';
end;

end.

Если я создаю каждый из этих классов и выводю сообщение

uses InheritedTest;  

...... 

procedure DoCreateTests;
var
  vMyIMyExample1, vMyIMyExample2, vMyIMyExample3_1, vMyIMyExample3_2 : IMyExample;
begin
  vMyIMyExample1 := TMyExample1.Create;
  vMyIMyExample2 := TMyExample2.Create;
  vMyIMyExample3_1 := TMyExample3.Create;
  vMyIMyExample3_2 := TMyExample3.CreateBypassingTMyExample2Create;

  Memo1.Lines.Add( 'vMyIMyExample1._MyMessage = ' + vMyIMyExample1._MyMessage );
  Memo1.Lines.Add( 'vMyIMyExample2._MyMessage = ' + vMyIMyExample2._MyMessage );
  Memo1.Lines.Add( 'vMyIMyExample3_1._MyMessage = ' + vMyIMyExample3_1._MyMessage );
  Memo1.Lines.Add( 'vMyIMyExample3_2._MyMessage = ' + vMyIMyExample3_2._MyMessage );
end;

на данный момент это выводит

vMyIMyExample1._MyMessage = TMyExample1
vMyIMyExample2._MyMessage = TMyExample1 TMyExample2
vMyIMyExample3ess11014 * vMyIMyExample3_2._MyMessage = TMyExample3.2

Я пытаюсь получить вызов TMyExample3.CreateBypassingTMyExample2Создать для вывода

vMyIMyExample3_2._MyMessage1_21yMessage1 TM21yyMessage TM211022 *

что мне нужно изменить в этом вызове, чтобы сделать эту работу?Можно ли сделать это без изменения или (добавив другой конструктор) в TMyExample2.create

constructor TMyExample3.CreateBypassingTMyExample2Create;
begin
  //inherited TMyExample1.Create;
  inherited ClassParent.Create;
  fMyMessage := fMyMessage + ' TMyExample3.2';
end;
...