Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi OO Frage: Warum kann Unterklasse Var-Typ ändern? (https://www.delphipraxis.net/101254-oo-frage-warum-kann-unterklasse-var-typ-aendern.html)

Ares 10. Okt 2007 15:05


OO Frage: Warum kann Unterklasse Var-Typ ändern?
 
Hallo!

Ich arbeite mich gerade etwas in die Objektorientierung ein und bin meinen Versuchen darauf gestoßen, dass folgendes möglich ist:

Delphi-Quellcode:
  TClass1 = class(TObject)
  private
    FTest: boolean;
  public
    constructor Create; virtual;
    property Test: boolean read FTest write FTest;
  end;

  TClass2 = class(TClass1)
  private
    FTest: string;
  public
    constructor Create; virtual;
    property Test: string read FTest write FTest;
  end;
Class2 ist also eine Unterklasse von Class1 und überschreibt den Datentyp des Feldes FTest sowie der zugehörigen Eigenschaft Test von boolean zu string.

Damit ist Class2 doch eigentlich keine Unterklasse von Class1 mehr, denn man kann ein Class1-Objekt nicht durch ein Class2-Objekt ersetzen. z.B. Hier:

Delphi-Quellcode:
var c1: TClass1;
    c2: TClass2;
begin
  c1 := TClass1.Create;
  c2 := TClass2.Create;

  c1.Test := true;
  c2.Test := 'test';

  if c1.Test then showMessage('Wahr')
    else showMessage('Falsch');
  if c2.Test then showMessage('Wahr') // kann nicht compiliert werden, da Test kein Boolean
    else showMessage('Falsch');
 
  c1 := c2;
  if c1.Test then showMessage('Wahr') // Liefer falsch
    else showMessage('Falsch');
end;
Man kann c2 also nicht im gleichen Coder verwenden wie c1 (in der If-Abfrage). Trotzdem kann man c1 c2 zuweisen...

Wäre es nicht "objektorientiert", wenn man den Typ eines Feldes in einer Unterklasse nicht ändern könnte? Bzw nur FTest: TTest1 durch FTest: TTest2 überschreiben kann wenn TTest2 eine Unterklasse von TTest1 ist?

Vielen Dank für eure Meinung hierzu!
Ares

Apollonius 10. Okt 2007 15:08

Re: OO Frage: Warum kann Unterklasse Var-Typ ändern?
 
Das Feld wird nur verdeckt. Du kannst nämlich schreiben:
Delphi-Quellcode:
if TClass1(c2).Test then showMessage('Wahr')
    else showMessage('Falsch');
Du hast in TClass2 also zwei gerschiedene Variablen mit dem gleichen Namen.

Dani 10. Okt 2007 16:02

Re: OO Frage: Warum kann Unterklasse Var-Typ ändern?
 
Ich stimme Ares zu, solche Fehlerquellen sollte eine Sprache eigentlich nicht erlauben.

edit: I spel gud

OregonGhost 10. Okt 2007 16:08

Re: OO Frage: Warum kann Unterklasse Var-Typ ändern?
 
Zitat:

Ich stimme Ares zu, solche Fehlerquellen sollte ein Sprache eigentlich nicht erlauben.
Einige jüngere Compiler (für andere Sprachen) geben in so einem Fall eine Warnung aus. Eigentlich wundert mich fast, dass der Delphi-Compiler das nicht auch macht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz