AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Vererbung von TObjectList

Ein Thema von Kishmet · begonnen am 10. Jan 2024 · letzter Beitrag vom 10. Jan 2024
Antwort Antwort
Kishmet

Registriert seit: 29. Okt 2020
Ort: Großraum Stuttgart
34 Beiträge
 
Delphi 12 Athens
 
#1

Vererbung von TObjectList

  Alt 10. Jan 2024, 10:07
Guten Morgen zusammen,

ich versuche grade eine Klasse zu vererben, verstehe hier aber wohl gerade etwas nicht so ganz. Vielleicht kann mir jemand auf die Sprünge helfen:

Ich habe diese Base Klasse:
Code:
  TMyDeviceList = class (TGenericSettings)
    strict private
      var
        FList: TObjectList<TMyDeviceListItem>;
    private
      var
        function GetCount: Integer;
        procedure Init; virtual;
    public
      var      
        constructor Create;
    published
      var
        property Count: Integer read GetCount;
  end;

Hier das Create:
Code:
procedure TMyDeviceList.init;
begin
  FList := TObjectList<TMyDeviceListItem>.Create(TRUE);
end;

constructor TMyDeviceList.Create();
begin
  inherited;
  init;
end;

mit der Funktion
Code:
function TMyDeviceList.GetCount: Integer;
begin
  result := FList.Count;
end;
Diese vererbt an:
Code:
  TPCListSettings = class(TMyDeviceList)
    private
      var
        FList: TObjectList<TPCListItem>;
        procedure init; override;
  end;

Implentierte Init:
Code:
procedure TPCListSettings.init;
begin
  FList := TObjectList<TPCListItem>.Create(TRUE);
end;

Wenn ich nun folgendes mache
Code:
  var myCount := PCListSettings.Count;
lande ich aber in der übergeordneten Klasse.

Nun meine Frage: Wieso lande ich mit der Funktion getCount in der FList von TMyDeviceList obwohl ich mich doch in der Klasse TPCListSettings befinde. Das macht für mich nur so Semi sinn. Wenn ich an einer anderen Funktion der Klasse bin, greift er doch auf die Korrekte Liste zu. Sollte die Funktion nicht ebenfalls auf die korrekte Liste zugreifen auch wenn Sie vererbt ist? oder musss ich hier wirklich mit einem override arbeiten und die gleiche Funktion nochmal schreiben? -> Falls ja würde das vererben an dieser Stelle für mich gar keinen Sinn machen und ich muss das alles wieder rausrupfen...

Prinzipiell: Kann ich überhaupt auf Variablen zurückgreifen welche ich in der Klasse welche Erbt redeklariert habe, indem ich Funktionen aus der vererbenden Klasse aufrufe? Oder lande ich hier immer in der Basisklasse und deren Variablen? Irgendwie macht das für mich grade keinen Sinn

Geändert von Kishmet (10. Jan 2024 um 10:17 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Vererbung von TObjectList

  Alt 10. Jan 2024, 10:17
Doch, es macht perfekt Sinn und ist auch genau so richtig, wie du es beobachtest hast. Das ist eigentlich eine der Stärken von Vererbung, dass du Verhalten (Methoden) und Daten (Variablen/Felder) aus der Klasse mit drin hast, von der du erbst.

GetCount() ist keine Zauberei, das gibt nur zurück, wie viele Elemente in der Liste drinstecken. Das ist ein TMyDeviceList genau wie auch in deiner abgeleiteten TPCListSettings - Es war nicht nötig, das GetCount() virtuell zu machen und nochmal redundant zu override n, und du hast das richtigerweise auch nicht noch mal gemacht.

Du kannst mit unterschiedlichen Sichtbarkeitsmodifikatoren (in Delphi private und protected ) steuern, ob Unterklassen die Methoden und Daten der Elternklasse sehen und aufrufen können dürfen.

Ich bin mir sicher, dass es viele gute Delphi-Tutorials gibt, die das Konzept von Objektorientierung und dabei die Vererbung gut erklären.


PS: Bonuspunkte für dich, dass du nicht versucht hast, direkt eine Unterklasse von TObjectList<TMyDeviceListItem> zu erstellen - Ich sehe das so oft, raufe mir dann immer die (wenigen) Haare und denke an Komposition an Stelle von Vererbung
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Vererbung von TObjectList

  Alt 10. Jan 2024, 10:27
Guten Morgen zusammen,

ich versuche grade eine Klasse zu vererben, verstehe hier aber wohl gerade etwas nicht so ganz. Vielleicht kann mir jemand auf die Sprünge helfen:

Ich habe diese Base Klasse:
Code:
  TMyDeviceList = class (TGenericSettings)
    strict private
      var
        FList: TObjectList<TMyDeviceListItem>;
    private
      var
        function GetCount: Integer;
    published
      var
        property Count: Integer read GetCount;
  end;
mit der Funktion

Code:
function TMyDeviceList.GetCount: Integer;
begin
  result := FList.Count;
end;
Diese vererbt an:
Code:
  TPCListSettings = class(TMyDeviceList)
    private
      var
        FList: TObjectList<TPCListItem>;
  end;
Wenn ich nun folgendes mache
Code:
  var myCount := PCListSettings.Count;
lande ich aber in der übergeordneten Klasse. Objekt ist natürlich erstellt und initialisiert. Ich habe den Teil nur weggelassen, um die frage etwas zu vereinfachen. Falls das aber wichtig wäre, würde ich das noch nachschieben. (Letzlich wird aber über eine init Funktion FList im Create erzeugt).

Nun meine Frage: Wieso lande ich mit der Funktion getCount in der FList von TMyDeviceList obwohl ich mich doch in der Klasse TPCListSettings befinde.
Weil GetCount nicht virtual ist und auch in TPCListSettings nicht per override durch eine angepasste Version ersetzt wurde. Es spielt keine Rolle, dass das Feld für die Liste in beiden Klassen FList heist, Du hast dann einfach in TPCListSettings zwei Felder dieses Namens, wobei das ererbte aber nicht erreichbar ist, da strict private. Und GetCount kennt nur dieses ererbte FData.
Mach das so:

Code:
  TBaseDeviceList<T> = class (TGenericSettings)
    strict private
      var
        FList: TObjectList<T>;
    private
        function GetCount: Integer;
    published
        property Count: Integer read GetCount;
  end;
  TMyDeviceLList = class(TBaseDeviceList<TMyDeviceListItem>)
  end;
  TPCListSettings = class(TBaseDeviceList<TPCListItem>)
  end;
FList erzeugst Du im constructor von TBaseDeviceList<T> als

FList := TObjectlist<T>.Create;
Peter Below
  Mit Zitat antworten Zitat
Kishmet

Registriert seit: 29. Okt 2020
Ort: Großraum Stuttgart
34 Beiträge
 
Delphi 12 Athens
 
#4

AW: Vererbung von TObjectList

  Alt 10. Jan 2024, 10:30
@peterbelow

ach verdammt, klar! Danke dir! Stehe heute glaube ich einfach mordsmäßig auf dem Schlauch...
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Vererbung von TObjectList

  Alt 10. Jan 2024, 10:37
@peterbelow

ach verdammt, klar! Danke dir! Stehe heute glaube ich einfach mordsmäßig auf dem Schlauch...
Es gibt halt Tage an denen sich das Aufstehen nicht lohnt...
Peter Below
  Mit Zitat antworten Zitat
Antwort Antwort

 

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:37 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