Autor Beitrag
Dornathal
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Di 30.09.08 16:55 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Di 30.09.08 17:08 
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


Zuletzt bearbeitet von delphiprogrammierer am Di 30.09.08 17:14, insgesamt 1-mal bearbeitet
Dornathal Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Di 30.09.08 17:13 
ausblenden 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

ausblenden 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
ausblenden Delphi-Quelltext
1:
2:
3:
4:
type
  TAlleine = class(TTransport)
    procedure zeigeDich; virtual; abstract;
   end;


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

Win XP, Vista
Delphi 7, Delphi 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



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

ausblenden Delphi-Quelltext
1:
2:
3:
4:
type
  TAlleine = class(TTransport)
    procedure zeigeDich; override; abstract;
   end;
Dornathal Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



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