Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Klasse auf vererbte Procedure prüfen (https://www.delphipraxis.net/168255-klasse-auf-vererbte-procedure-pruefen.html)

Pitschki1801 11. Mai 2012 10:54

Klasse auf vererbte Procedure prüfen
 
Guten Tag zusammen,

ich habe ein Basisobjekt von dem mehrere Objekte abgeleitet werden. In der Basis gibt es eine virtuelle Procedure die ich in manchen Ableitungen überschreibe.
Ich möchte nun in meiner Basis prüfen, ob meine abgeleitete Klasse die virtuelle Procedure der Basis überschreibt und die Basis per Inherited aufruft.
Nur finde ich keine Anhaltspunkt wie ich dies prüfen kann und ob dies überhaupt möglich ist. Per Aufrufstack kann ich ja sehen ob ich aus meiner Ableitung komme oder ob die Funktion direkt aufgerufen wird. Gibt es vielleicht über diesen Weg eine Möglichkeit dies zu prüfen?

Hier noch ein kleines Bespiel:
Delphi-Quellcode:
MyBaseObject= class(TObject)
protected
  procedure MachIrgenwas; virtual;
end;

procedure MyBaseObject.MachIrgenwas; //virtual;
begin
  //Hier möchte ich prüfen
  //Hat die abgeleitet Klasse die procedure überschrieben
  //wenn ja 1+1
  //sonst 1-1 
end;
Grüße
Pitschki

shmia 11. Mai 2012 11:10

AW: Klasse auf vererbte Procedure prüfen
 
Aus Sicht des OOP ist dein Ansatz schon falsch.
Die Basisklasse darf keine Implementierungsdetails der abgeleiteten Klassen kennen.

Du könntest aber so vorgehen:
Delphi-Quellcode:
TClassFeature = (cfKannDrucken, cfKannSpeichern,...);
TClassFeatures = set of TClassFeature;

MyBaseObject= class(TObject)
protected
  function HasFeature:TClassFeatures; virtual;abstract;
end;
Die abgeleitete Klasse muss HasFeature überschreiben.
Damit kann in der Basisklasse festgestellt werden, welche Features die abgeleitete Klasse beherrscht.

himitsu 11. Mai 2012 11:20

AW: Klasse auf vererbte Procedure prüfen
 
Schau dir mal den TStream an, speziell die Seek-Methoden für 32 Bit und 64 Bit.

Über die (neue) RTTI könnte man da bestimmt auch was machen.


Aber ich würde dir eher empfehlen, daß dieses -1/+1 vom Nachfahren angestoßen/implementiert wird.
Die Vorfahren sollten im Normalfall nichts davon wissen ob und womöglich noch von wem sie abgeleitet wurden.

Pitschki1801 11. Mai 2012 12:00

AW: Klasse auf vererbte Procedure prüfen
 
Danke schonmal für die Antworten.
Ihr hab natürlich recht, dass dies an der Stelle eigentlich nicht angebracht ist. Nur ist die Architektur, die bereits dahinter steckt, nicht mehr so leicht zu ändern.
Ich werde mir mal den TStream und RTTI anschauen, ob ich damit zurecht kommen.
Wenn nicht melde ich mich wieder :)

Bbommel 11. Mai 2012 12:14

AW: Klasse auf vererbte Procedure prüfen
 
Ich bin nicht ganz sicher, ob ich dich richtig verstanden habe, aber meinst du es vielleicht etwa so?

Delphi-Quellcode:
MyBaseObject= class(TObject)
protected
  procedure MachIrgenwas; virtual;
end;

MyInheritedObject = class(myBaseObject)
protected
  procedure MachIrgenwas; override;
end;

procedure MyBaseObject.MachIrgenwas; //virtual;
begin
  //Hier möchte ich prüfen
  //Hat die abgeleitet Klasse die procedure überschrieben
  if self is myInheritedObject then
    1+1  // was auch immer das sein soll. ;)
  else
    1-1
end;

procedure MyInheritedObject.MachIrgenwas;
begin
  inherited;

  // weiterer eigener Code
end;
Tut doch was du willst, oder?

himitsu 11. Mai 2012 12:20

AW: Klasse auf vererbte Procedure prüfen
 
Das prüft nur, ob die ganze Klasse abgeleitet wurde, aber ob auch die betreffende Methode überschrieben wurde, bleibt dabei unbeachtet.

Bbommel 11. Mai 2012 12:27

AW: Klasse auf vererbte Procedure prüfen
 
Joa, klar. :) Aber von der Fragestellung her ging ich davon aus, dass er vorhat, die Prozedur auf jeden Fall zu überschreiben und dann per inherited wieder in der Basis zu landen. Und dort, in der Basis, will er dann wissen, ob er per inherited dorthin gekommen ist oder nicht. Und wenn das so sein sollte, dann müsste der Code helfen.

stahli 11. Mai 2012 13:53

AW: Klasse auf vererbte Procedure prüfen
 
Vielleicht eine Klassenvariable?
Delphi-Quellcode:
HasFeatureValue:Byte=0; // bzw. 1
oder
Delphi-Quellcode:
OwnHasFeatureValue:Boolean=False; // bzw. True
Die Werte müssten dann natürlich im Contructor gesetzt werden.

himitsu 11. Mai 2012 14:40

AW: Klasse auf vererbte Procedure prüfen
 
Siehe TStream:
Dort gibt es 2 Basismethoden, wovon mindestens Eine überschrieben sein muß.
In TStream wird dann, beim Aufruf der Nichtüberschriebenen auf die Andere weitergeleitet.
Nun gibt es aber in beiden Methoden jeweils eine Weiterleitung zum anderen, was zu einer Endlosschleife führen würde, darum wird dort geprüft, ob auch wirklich überschrieben wurde, um eventuell eine Fehlermeldung zu werfen.

Das Grundprinzip ist einfach.
Man besorgt sich von beiden Typen die Adressen der Methoden und vergleicht diese.
> sind sie ungleich, dann wurde überschrieben




Oder man geht eben über die RTTI und besorgt sich darüber die Adressen. (über die neue RTTI geht das recht einfach)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:15 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