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;