![]() |
Vererbungsprobleme
Irgendwie steh ich bei der Vererbung grad auf dem Schlauch.
Ich habe eine Klasse von TObjectlist abgeleitet und (unter anderem) die Add-Methode überschrieben. TMyObjectList = class(TObjectList) function Add(AObject: TMyObject): Integer;reintroduce; virtual; end; function TMyObjectList.Add(AObject: TMyObject): Integer; begin inherited Add(AObject); MachSonstNochWas; end; Ich übergebe meine Liste an eine Funktion einer anderen Klasse, die ein Objekt erzeugt und der Liste hinzufügt. procedure TAnotherclass.Tuwas(ObjectList: TObjectList); MyObject:=TMyObject.Create; Objectlist.Add(MyObject); An dieser Stelle wird jedoch die Add-Funktion der Basisklasse Objectlist aufgerufen, nicht die Add-Funktion meiner abgeleiteten Klasse, die SonstNochWas erledigen sollte. Nur wenn ich in meiner procedure Tuwas aus der TObjectlist eine TMyObjectlist mache, funktioniert das ganze. Ich will aber meine TAnotherclass nicht von meiner TMyObjectlist abhängig machen, die soll auch mit einer TObjectlist funktionieren. Wie ist dieses Problem zu lösen? Gruß Rainer |
Re: Vererbungsprobleme
Zitat:
|
Re: Vererbungsprobleme
Delphi-Quellcode:
EDIT: zu Lahm
TMyObjectList = class(TObjectList)
function Add(AObject: TMyObject): Integer;override; end; |
Re: Vererbungsprobleme
overriden kann ich aber nicht, da Add in TObjectlist nicht als virtuell markiert ist
Rainer |
Re: Vererbungsprobleme
Jo, eben Pech gehabt. :mrgreen: Du musst eben sogar zurück bis zur TList und das Add komplett neu erfinden. Alternative : Vorgehensweise neu überdenken. :shock:
|
Re: Vererbungsprobleme
Ich würde die Add() Methode nicht überschreiben, sondern eine neue Methode (z.B. AddObject) einführen.
Damit umgehst du die Probleme. Du könntest sogar eine weitere Komfortfunktion dazupacken:
Delphi-Quellcode:
// Object erzeugen und in die Liste anfügen in einem Aufwasch
function TMyObjectList.CreateAndAdd:TMyObject; begin result := TMyObject.Create; AddObject(result); end; |
Re: Vererbungsprobleme
Zitat:
Und nun zu dem Problem: Du kannst Add() neu implementieren, aber nicht überschreiben, da nicht als dynamisch oder virtuell deklariert, ist ok. Aber das ist nicht so schlimm, lass einfach das ReIntroduce weg (ist eh nicht virtuell oder dynamisch, somit besteht überhaupt kein Anlass dafür) und beseitige das eigentliche Problem an der folgenden Stelle: Zitat:
Delphi-Quellcode:
Oder halt spezialisieren:
procedure TAnotherclass.Tuwas(ObjectList: TMyObjectList);
MyObject := TMyObject.Create; Objectlist.Add(MyObject);
Delphi-Quellcode:
procedure TAnotherclass.Tuwas(ObjectList: TObjectList);
MyObject := TMyObject.Create; ( Objectlist As TMyObjectList ).Add(MyObject); |
Re: Vererbungsprobleme
So ähnlich hatte ich das inzwischen auch gelöst.
Delphi-Quellcode:
Schade, daß es nicht ohne diesen Umweg zu machen ist.
TMyAnotherClass = class(TAnotherClass)
procedure TuWas(ObjectList: TMyObjectList) end procedure TMyAnotherclass.Tuwas(ObjectList: TMyObjectList); MyObject:=TMyObject.Create; Objectlist.Add(MyObject); Danke für die Hilfe Rainer |
Re: Vererbungsprobleme
Hi,
doch es ist ohne diesen Umweg zu machen. Wenn Du dir die Definition von "TObjectList" anschaust erkennst Du, daß zwar nicht die Methode "Add", wohl aber die Methode "Notify" überschrieben werden kann. Über diese Methode wird gemeldet, welche Aktion gerade passiert ist. In deiner Ableitung müsste also nur das hier stehen:
Delphi-Quellcode:
protected
procedure Notify(Ptr: Pointer; Action: TListNotification); override; [...] procedure TMyObjectList.Notify(Ptr: Pointer; Action: TListNotification); begin inherited Notify(Ptr, Action); if Action = lnAdded then MachSonstNochWas; end; |
Re: Vererbungsprobleme
Zitat:
1. ...in der Liste steht 2. ...ausserhalb der Liste beim Benutzer der Liste steht 3. ...Im Objekt selber steht was in der Liste verwaltet wird. Du bietest eine Lösung an, welche die Implementierungsstelle komplett in eine andere Datenkapselung verschiebt. Es ist für eine Listenklasse zur Verwaltung der Liste definitiv nicht zu zu muten etwas speziell für ein Objekt seiner Liste zu machen. Du verschiebst diesen Code über die Kapselungen hinaus in eine andere Kapselung die damit nichts mehr gemein hat. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:36 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