Autor Beitrag
Currywurst
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50

Win XP Pro
D3 Pro, D5 Std, D6 Pers
BeitragVerfasst: Sa 20.07.02 08:04 
da diese einfache frage innem anderen forum keiner beantwortet hat, versuch ichs mal hier :-)
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50

Win XP Pro
D3 Pro, D5 Std, D6 Pers
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34



BeitragVerfasst: 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 :(

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50

Win XP Pro
D3 Pro, D5 Std, D6 Pers
BeitragVerfasst: 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