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