AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Klasse auf vererbte Procedure prüfen

Ein Thema von Pitschki1801 · begonnen am 11. Mai 2012 · letzter Beitrag vom 11. Mai 2012
Antwort Antwort
Pitschki1801

Registriert seit: 9. Feb 2012
14 Beiträge
 
Delphi XE Professional
 
#1

Klasse auf vererbte Procedure prüfen

  Alt 11. Mai 2012, 10:54
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

AW: Klasse auf vererbte Procedure prüfen

  Alt 11. Mai 2012, 11:10
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#3

AW: Klasse auf vererbte Procedure prüfen

  Alt 11. Mai 2012, 11:20
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (11. Mai 2012 um 11:23 Uhr)
  Mit Zitat antworten Zitat
Pitschki1801

Registriert seit: 9. Feb 2012
14 Beiträge
 
Delphi XE Professional
 
#4

AW: Klasse auf vererbte Procedure prüfen

  Alt 11. Mai 2012, 12:00
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
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
650 Beiträge
 
Delphi 12 Athens
 
#5

AW: Klasse auf vererbte Procedure prüfen

  Alt 11. Mai 2012, 12:14
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#6

AW: Klasse auf vererbte Procedure prüfen

  Alt 11. Mai 2012, 12:20
Das prüft nur, ob die ganze Klasse abgeleitet wurde, aber ob auch die betreffende Methode überschrieben wurde, bleibt dabei unbeachtet.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
650 Beiträge
 
Delphi 12 Athens
 
#7

AW: Klasse auf vererbte Procedure prüfen

  Alt 11. Mai 2012, 12:27
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.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Klasse auf vererbte Procedure prüfen

  Alt 11. Mai 2012, 13:53
Vielleicht eine Klassenvariable?
HasFeatureValue:Byte=0; // bzw. 1 oder
OwnHasFeatureValue:Boolean=False; // bzw. True Die Werte müssten dann natürlich im Contructor gesetzt werden.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#9

AW: Klasse auf vererbte Procedure prüfen

  Alt 11. Mai 2012, 14:40
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 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