Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - wie prüfen ob eine abstrakte methode überschrieben wurde?
Currywurst - Sa 20.07.02 08:04
Titel: wie prüfen ob eine abstrakte methode überschrieben wurde?
da diese einfache frage innem anderen forum keiner beantwortet hat, versuch ichs mal hier :-)
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| type TTestA = Class(TObject) public procedure Test; procedure virtAbst; virtual; abstract; end; TTestB = Class(TTestA) public // virtAbst wird NICHT überschrieben end; procedure TTestA.Test; begin //hier müsste ich vorm ausführen dann testen ob virtAbst überschrieben wurde virtAbst; end;
var b: TTestB; ... b.Test; //würde dann also zum fehler führen |
wie kann ich das also sauber(!) umgehen?
Tino - Sa 20.07.02 08:47
Aber warum definierst Du eine Mehtode als Abstract wenn es vorkommen kann das diese so wie so nicht in einem Abgeleiteten Objekt überschrieben /definiert wird. Macht für mich keinen Sinn. Als Lösungsvorschlag würde ich Dir dies geben:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| Type tTestA = Class (tObject) Public procedure Test; procedure virtAbst; virtual; End; tTestB = Class (tTestA) Public // virtAbst wird NICHT überschrieben End; Procedure TTestA.virtAbst; Begin { nothing } End;
Procedure TTestA.Test; Begin virtAbst; End; |
Die Methode
virtAbst wird also nicht abstract definiert und in der Implementation dient diese Methode nur als "Dummy". Das hat den Vorteil das die Mehtode
virtAbst nicht unbeding überschrieben werden muss!
Gruß
TINO
Currywurst - Sa 20.07.02 09:03
Titel: hast ja recht
aber is die sache mit dem abstract nich genau dafür da leere methoden für sachen die eh überschrieben werden müssen zu vermeiden?
es ging mir aber auch wirklich um die lösung, nicht um eine andere möglichkeit, denn ich will ja brav noch was lernen :-)
Tino - Sa 20.07.02 14:02
Eine Antwort auf Deine Frage habe ich nicht. Aber für mich stellt sich immer noch die Frage aus meinem ersten Posting:
Aber warum definierst Du eine Mehtode als Abstract wenn es vorkommen kann das diese in einem Abgeleiteten Objekt nicht überschrieben /definiert wird?
Gruß
Klabautermann - Sa 20.07.02 16:10
Hallo,
Tino hat folgendes geschrieben: |
Eine Antwort auf Deine Frage habe ich nicht. |
meines wissens gibt es auch keine. Abstrakte Virtuelle Methoden sind zum definieren von Prototypen da. Der Programmierer hat selber darauf zu achten diese nicht aufzurufen. Wenn es einen schutz gäde, würde Borland ihn glaube ich für die Eigenen Komponenten verwenden. Wenn man aber einmal versucht z.B. mit tStrings zu arbeiten wird man feststellen, das sie so etwas nicht tun.
Gruß
Klabautermann
aogwaba - So 21.07.02 21:44
Um ganz sicher zu sein ob eine abstracte Methode überschrieben wurde,
schau in den Quelltext, oder benutze stattdessen die guten alten Interfaces.
cu
waba
mth - Mo 22.07.02 02:15
Titel: Re: wie prüfen ob eine abstrakte methode überschrieben wurde
Currywurst hat folgendes geschrieben: |
wie kann ich das also sauber(!) umgehen?
|
Es geht, aber ob es "sauber" genug für deine Zwecke ist, überlasse ich Dir zu beurteilen. Du vergleichst die Methodenzeiger der Methode der Basisklasse und der Methode der abgeleiteten Klasse. Sind sie nicht identisch wurde die Methode überschrieben.
Der Harken dabei ist, dass die abgeleitete Klasse direkt den Vorfahr ansprechen und kennen muß der die abstrakte Methode einführt. Nicht unbedingt saubers OOP :(
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TTestA.Test; var ThisMethod: TMethod; BaseMethod: TMethod; p: Pointer;
begin MethodCall(ThisMethod) := self.virtAbst; p := pointer(TTestA); MethodCall(BaseMethod) := TTestA(@p).virtAbst; if BaseMethod.Code <> ThisMethod.Code then virtAbst; end; |
Currywurst - Mo 22.07.02 07:48
ok, danke für eure antworten, ich lebe jetzt einfach mit nur virtuellen methoden...
"schau in den quelltext" war eigentlich ein guter tipp, nur warum kann das der delphi compiler nicht für mich machen?
naja, kann trotzdem mit leben
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!