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 user profile iconNarses: 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 //Attribute
    zPosition : TVektor;

  public //Methoden
    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 //Attribute
    zValue : Integer;
    kenntTransporte : TObjectList;

     //Objektbeziehungen:
        // kenntTATransport : TATransport;
        // kenntTATransport () of TATransport;

  public //Methoden
    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 //Methoden
    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

user profile iconDornathal 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