Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Auf Feld der übergeordneten Klasse zugreifen (https://www.delphipraxis.net/131104-auf-feld-der-uebergeordneten-klasse-zugreifen.html)

silver-moon-2000 18. Mär 2009 22:08


Auf Feld der übergeordneten Klasse zugreifen
 
Hallo zusammen,

ich habe (mal wieder) eine Grundsatzfrage, (der Post wird also wieder etwas länger)

Delphi-Quellcode:
type TBookShelf = class(TObject)
  private
    FSavePath : string;
    FBooks : TObjectList;
  public
end;

type TBook = class(TObject)
  private
    FBookTitle : string;
    FChapters : TObjectList;
end;

type TChapter = class(TObject)
  private
    FChapterTitle : string;
  public
    procedure OpenChapter;
end;
Die Klasse TChapter hat nun eine Methode namens OpenChapter, die dieses Chapter (das als PDF File existiert) mit dem zugehörigen Programm (per Shell-Execute o.Ä.) öffnen soll

Nun das eigentliche Problem: Wie bekomme ich in TChapter den gesamten Dateinamen heraus, der sich folgendermaßen zusammensetzt:
"TBookShelf".FSavePath\"TBook".FBookTitle\"TChapte r".FChapterTitle.pdf

Die einzige Möglichkeit, die ich kenne, wie es zu machen geht, wäre, dass ich über die Konstruktoren den Instanzen von TBook & TChapter eine Referenz auf deren "Parent" mitgebe:
Delphi-Quellcode:
constructor TBook.Create(bks : TBookShelf)
constructor TChaoter.Create(bk : TBook)
[...]

in TBookShelf:
  FBooks.Add(TBook.Create(self));

[...]

in TBook:
  FChapters.Add(TChapter.Create(self));
Somit also am Beispiel von TChapter (TBook analog: FBookShelf : TBookShelf)
Delphi-Quellcode:
type TChapter = class(TObject)
  private
    FChapterTitle : string;
    FBook : TBook;
  public
    constructor Create(bk : TBook);
    procedure OpenChapter;
end;

constructor TChapter.Create(bk : TBook);
begin
  inherited Create;
  FBook := bk;
end;

procedure TChapter.OpenChapter;
var completePath : string;
begin
  completePath := bk.FBookShelf.SavePath + bk.BookTitle + FChapterTitle;
end;
Ich habe dabei das Gefühl, den OOP Ansatz nicht wirklich umzusetzen / verstanden zu haben, wenn ich jedem Element eine Referenz auf seinen "Parent" mitgebe.

Um diesen langen und zugegebenermaßen verwirrenden Post zusammenzufassen:
Gibt es eine andere Möglichkeit, in TChapter auf Felder aus TBook und TBookShelf zuzugreifen, als jedem Element eine Referenz auf seinen "Parent" zu geben

p.s. mir ist so, als ob ich diese Frage schon mal gestellt hätte, aber ich habe bei einer Suche nichts gefunden. Falls dem tatsächlich so ist, tut's mit leid.

mkinzler 19. Mär 2009 05:40

Re: Auf Feld der übergeordneten Klasse zugreifen
 
Über den Owner. Du hast ja beim Erzeugen das TBookShelf bzw. das -Objekt als diesen übergeben. Also:
Delphi-Quellcode:
completePath := bk.((Owner as TBook) as TBookShelf)).SavePath + bk.(Owner as TBookShelf).BookTitle + FChapterTitle;

taaktaak 19. Mär 2009 07:29

Re: Auf Feld der übergeordneten Klasse zugreifen
 
Auch wenn's funktioniert - ist das sinnvoll? Wenn andere Klassen den Zugriff auf private-Felder benötigen, dann sollte der Zugriff doch wohl besser über properties erfolgen, oder?

silver-moon-2000 19. Mär 2009 08:24

Re: Auf Feld der übergeordneten Klasse zugreifen
 
Danke für eure Antworten,
(wie immer gibts dabei ein) aber:

Zitat:

Zitat von mkinzler
Über den Owner. Du hast ja beim Erzeugen das TBookShelf bzw. das -Objekt als diesen übergeben. Also:
Delphi-Quellcode:
completePath := bk.((Owner as TBook) as TBookShelf)).SavePath + bk.(Owner as TBookShelf).BookTitle + FChapterTitle;

Owner gibt's doch bei TObject, von dem ich ableite nicht, oder? Sonst hätte ich das auch gerne gemacht. Owner wird in TComponent eingeführt, für mich war TComponent bisher "Grundlage für (nicht)graphische IDE-Componenten" und daher für einfache Classen wie die meinen zu überladen. Aber der Owner machts dann wieder wett.

Zitat:

Zitat von taaktaak
Auch wenn's funktioniert - ist das sinnvoll? Wenn andere Klassen den Zugriff auf private-Felder benötigen, dann sollte der Zugriff doch wohl besser über properties erfolgen, oder?

Auf wen beziehst Du dich? Du hast natürlich recht, statt auf private Felder zuzugreifen, machen properties mehr Sinn, dafür sind sie schließlich da. War ich wohl gestern abend zu müde zu.

Danke für eure Hilfe, hier habe ich immer wieder gerne Probleme :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:25 Uhr.

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