Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Vererbungsprobleme (https://www.delphipraxis.net/111252-vererbungsprobleme.html)

Rainer Wolff 1. Apr 2008 10:07


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

Hansa 1. Apr 2008 10:17

Re: Vererbungsprobleme
 
Zitat:

Zitat von Rainer Wolff
..eine Klasse von TObjectlist abgeleitet und (unter anderem) die Add-Methode überschrieben.

Du hast sie nicht überschrieben (das wäre "override") sondern rufst sie gezielt noch mit inherited direkt auf !

Kroko1999 1. Apr 2008 10:18

Re: Vererbungsprobleme
 
Delphi-Quellcode:
TMyObjectList = class(TObjectList)
function Add(AObject: TMyObject): Integer;override;
end;
EDIT: zu Lahm

Rainer Wolff 1. Apr 2008 10:40

Re: Vererbungsprobleme
 
overriden kann ich aber nicht, da Add in TObjectlist nicht als virtuell markiert ist

Rainer

Hansa 1. Apr 2008 10:50

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:

shmia 1. Apr 2008 10:54

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;

Muetze1 1. Apr 2008 13:51

Re: Vererbungsprobleme
 
Zitat:

Zitat von shmia
Ich würde die Add() Methode nicht überschreiben, sondern eine neue Methode (z.B. AddObject) einführen.
Damit umgehst du die Probleme.

In wie fern denn? Wir sind schon bei einer TObjectList, somit ist Add() schon für Objekte. Du willst nun AddObject() deklarieren die dann zu dem Objekt noch ein Objekt annimmt? In wie fern umgeht man damit die Probleme?

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:

Zitat von Rainer Wolff
Delphi-Quellcode:
procedure TAnotherclass.Tuwas(ObjectList: TObjectList);
  MyObject:=TMyObject.Create;
  Objectlist.Add(MyObject);

Du übergibst die Listenklasse mit deren Basisklasse. Da du Add() nicht überschreiben kannst (höchstens verdecken, etc), wird deine abgeleitete Add() Funktion niemals aufgerufen, ausser du spezialisierst die Klasse zuvor oder du übergibst diese schon in der spezialisierten Form. Also entweder so:

Delphi-Quellcode:
procedure TAnotherclass.Tuwas(ObjectList: TMyObjectList);
  MyObject := TMyObject.Create;
  Objectlist.Add(MyObject);
Oder halt spezialisieren:

Delphi-Quellcode:
procedure TAnotherclass.Tuwas(ObjectList: TObjectList);
  MyObject := TMyObject.Create;
  ( Objectlist As TMyObjectList ).Add(MyObject);

Rainer Wolff 1. Apr 2008 14:19

Re: Vererbungsprobleme
 
So ähnlich hatte ich das inzwischen auch gelöst.

Delphi-Quellcode:
TMyAnotherClass = class(TAnotherClass)
  procedure TuWas(ObjectList: TMyObjectList)
end

procedure TMyAnotherclass.Tuwas(ObjectList: TMyObjectList);
  MyObject:=TMyObject.Create;
  Objectlist.Add(MyObject);
Schade, daß es nicht ohne diesen Umweg zu machen ist.

Danke für die Hilfe

Rainer

KrasserChecker 1. Apr 2008 14:25

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;

Muetze1 1. Apr 2008 15:20

Re: Vererbungsprobleme
 
Zitat:

Zitat von KrasserChecker
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.

Es ist aber ein recht grosser Unterschied, wenn TuWas() als Code ...

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 09:44 Uhr.
Seite 1 von 2  1 2      

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