Einzelnen Beitrag anzeigen

EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
415 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Override von Konstanten im Objekt - Alternative?

  Alt 26. Dez 2017, 10:21
ich habe einfach mit dem Beispiel von Uwe Rabe gespielt und folgenden code vervollständigt:
Delphi-Quellcode:
unit uMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    lblA: TLabel;
    lblB: TLabel;
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    procedure btn1Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Type
  TObjectA = class
  strict private const
    cTestValue = 'aaa';
  public
    Function testvalue: String; virtual;
    Procedure MachWasMitTestValue;
  end;

  TObjectB = class(TObjectA)
  strict private const
    cTestValue = 'bbb';
  public
    Function testvalue: String; override;
  end;

procedure TObjectA.MachWasMitTestValue;
begin
  ShowMessage(testvalue);
end;

function TObjectA.testvalue: String;
  begin
    Result := cTestValue;
  end;

  function TObjectB.testvalue: String;
  begin
    Result := cTestValue;
  end;

procedure TForm1.btn1Click(Sender: TObject);
var ObjectA:TObjectA;
begin
  ObjectA := TObjectA.Create;
  try
    lblA.Caption:=ObjectA.testvalue;
    //ObjectA.MachWasMitTestValue;
  finally
    ObjectA.Free;
  end;
  ObjectA.MachWasMitTestValue;
end;

procedure TForm1.btn2Click(Sender: TObject);
var ObjectB: TObjectB;
begin
  ObjectB:=TObjectB.create;
  try
    lblB.Caption:=ObjectB.testvalue;
    ObjectB.MachWasMitTestValue;
  finally
    ObjectB.free;
  end;
end;

procedure TForm1.btn3Click(Sender: TObject);
begin
  close;
end;

end.
Dann habe ich wie geschrieben die Methode MachwasmitTestValue versehentlich nach der Freigabe des ObjectA aufgerufen und es geht. Es geht wie es gehen soll innerhalb des try...finaly-Blocks, aber ach Wunder: auch hinter diesem, aber warum?
Norbert
  Mit Zitat antworten Zitat