Einzelnen Beitrag anzeigen

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