Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Abstrakter fehler trotz methode in Tochterklasse
Dornathal - Di 30.09.08 16:55
Titel: Abstrakter fehler trotz methode in Tochterklasse
Hallo
Momentan habe ich folgendes problem:
Ich habe eine procedure als Abstarkt deklariert. Dass bedeutet dann ja dass ich die Procedure in der Tochterklasse erwähnen muss.
Da ich allerdings ich glaube 4 Tochterklassen von der ursprünglichen Klasse aus vererbt habe habe ich gedacht wenn ich jeweils in die Tochterklasse die Procedure als abstarct wieder erwähne reicht das anscheinend nicht aus. Oder hab ich da jetzt was vergessen zu beachten?
es wäre toll wenn ich die Methode nur in der letzten Klasse implementieren muss.
So sieht das Aus: TSichtbar -> TTRansport -> TAlleine -> Tnadel.
Also ich hab in TSichtbar die Methode erstmals erwähnt und will sie nun nur in TNadel weiter definieren.
Ich hoffe es wird wer aus meinen Hyroglyphen schlau.
MF Dorny
delphiprogrammierer - Di 30.09.08 17:08
Titel: Re: Abstrakter fehler trotz methode in Tochterklasse
Denke jetzt hab ichs verstanden, was du meinst :
Deklariere in TSichtbar eine Procedure als Abstract
Deklariere in TNadel die abstracte Procedure aus TSichtbar aber nicht als abstract.
Dann sollte es klappen
Moderiert von
Narses: Komplett-Zitat des ersten Beitrags entfernt
Dornathal - Di 30.09.08 17:13
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| type TSichtbar = class
protected zPosition : TVektor;
public constructor init (pPosition: TVektor); virtual; procedure AddiereZuPosition (pVektor: TVektor); virtual; procedure setzePosition (pPosition: TVektor); virtual; function gibPosition : TVektor; virtual; destructor gibFrei; virtual; procedure ZeigeDich; virtual; abstract;
end; |
Mutter aller Töchter
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| type TTransport = class(TSichtbar)
protected zValue : Integer; kenntTransporte : TObjectList;
public procedure SetzeValue (pZValue: Integer); virtual; procedure zeigeDich; virtual; abstract; function GibValue : Integer; virtual;
end; |
Erste Tochter
Delphi-Quelltext
1: 2: 3: 4:
| type TAlleine = class(TTransport) procedure zeigeDich; virtual; abstract; end; |
Zweie Tochter
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| type TNadel = class(TAlleine)
public procedure zeigeDich; override; end; |
Tochter aller Töchter
Hoffe das reicht euch an Code. Beim aufrufen von TNadel.init; wird self.zeigeDich; aufgerufen. Dann kommt der abstrakte fehler.
Geschieht in der Klasse TSichtbar.
| Zitat: |
Denke jetzt hab ichs verstanden, was du meinst :
Deklariere in TSichtbar eine Procedure als Abstract
Deklariere in TNadel die abstracte Procedure aus TSichtbar aber nicht als abstract.
Dann sollte es klappen |
Hab ich ja. Oder sehe ich was falsch?
Nico72 - Di 30.09.08 17:59
Hallo,
in allen Klassen, von denen du eine Instanz erzeugst, musst du sämtliche abstrakten Methoden überschreiben. Wenn du einen abstrakten Fehler in TSichtbar hast, scheinst du entweder eine Instanz von ihr erstellt zu haben oder du rufst mit inherited die geerbte (abstrakte) Methode auf (das schreibt Delphi beim Klassen-Vervollständigen von allein in die Methode). Poste doch mal den Code von ZeigeDich.
Ach, und es macht Sinn, Konstruktoren Create und Destruktoren Destroy zu nennen...
SvenAbeln - Di 30.09.08 18:08
Dornathal hat folgendes geschrieben: |
Hab ich ja. Oder sehe ich was falsch? |
Du hast zusätzlich aber noch in TTransport und TAlleine jeweils eine neue virtuelle Funktion ZeigeDich definiert. Der Compiler gibt bei mir auch die folgende Warnung aus:
[DCC Warnung] Unit14.pas(33): W1010 Methode 'ZeigeDich' verbirgt virtuelle Methode vom Basistyp 'TSichtbar'
Lösche einfach jeweils die abstakten Funktionen Zeigedich in den Klassen TTransport und TAlleine oder definiere sie hier als override.
Delphi-Quelltext
1: 2: 3: 4:
| type TAlleine = class(TTransport) procedure zeigeDich; override; abstract; end; |
Dornathal - Mi 01.10.08 12:21
Ahh danke
Das war wohl der fehler, dass ich die procedure in den Tochterklassen mit virtual und nicht mit override definiert hatte.
jetzt geht es ...
In der procedure zeigeDich wird kein inherited ausgeführt.
Danke und MFG Dornathal
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!