AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Richtiges Mittel anstatt virtueller generischer Variable
Thema durchsuchen
Ansicht
Themen-Optionen

Richtiges Mittel anstatt virtueller generischer Variable

Ein Thema von hzzm · begonnen am 26. Apr 2018 · letzter Beitrag vom 27. Apr 2018
 
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Richtiges Mittel anstatt virtueller generischer Variable

  Alt 27. Apr 2018, 12:48
Du könntest "Inhalt" in TSnack deklarieren und so belassen. In den abgeleiteten Klassen könntest Du dann dessen Items (TFood) in TErdnuss casten und mit dem Cast weiter artbeiten. Allerdings könntest Du dann auch einfach mit TObjectList statt mit generischen Listen arbeiten.
Klingt verlockend: Ich erstelle diese TArray<TFood>'s nur als TArray<TErdnuss> oder TArray<TZitrone>, nie als TArray<TFood>; ausserdem immer ueber TErdnussSnack oder TZitronenSnack. Ist es bei den Casts dennoch sichergestellt, dass die zusaetzlichen spezifischen Eigenschaften nie verloren gehen, solange ich Create nie ueber TFood laufen lasse?
Mhh, das verstehe ich jetzt nicht. Casten musst du eigentlich gar nicht, wenn du deine Klasse so deklarierst:
Delphi-Quellcode:
type
  TFood = class
    Breite: Integer;
  end;

  TZitrone = class(TFood)
    Saeuerlichkeit: Double;
  end;

  TErdnuss = class(TFood)
    Schale: Boolean;
    Geschmack: string;
  end;

  TSnack<T: TFood> = class
  private
    FInhalt: TArray<T>;
  public
    GegessenVon: string;
    property Inhalt: TArray<T> read FInhalt write FInhalt;
    procedure NulleBreiten; // allg. gueltig fuer TZitrone und TErdnuss
  end;

  TZitronenSnack = class(TSnack<TZitrone>);
  TErdnussSnack = class(TSnack<TErdnuss>);
Die beiden spezialisierten Klassen können jetzt jeweils nur entweder 0..n Zitronen oder 0..n Erdnüsse enthalten. TMixedSnack = TSnack<TFood> wäre weiterhin eine Möglichkeit, die beide Speisen enthalten kann.

Edit:
Achso du meinst vermutlich beim Erstellen. Wenn die Klasseninstanz konkret als z.B. TZitrone.Create erstellt wurde, hast du selbstverständlich weiterhin immer alle spezifischen Eigenschaften. Falls benötigt, könntest du auch den Constructor von TFood als virtual deklarieren. Das würde dir erlauben Objekte auch über die Meta-Klasse TFoodClass = class of TFood zu erzeugen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (27. Apr 2018 um 12:52 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:19 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-2025 by Thomas Breitkreuz