AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[gelöst] Vererbung funktioniert nicht

Ein Thema von Viktorii · begonnen am 10. Okt 2007 · letzter Beitrag vom 10. Okt 2007
Antwort Antwort
Seite 1 von 2  1 2      
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#1

[gelöst] Vererbung funktioniert nicht

  Alt 10. Okt 2007, 11:53
Hallo zusammen.

Ich bin relativ neu im Bereich OOP und habe bei meiner ersten Vererbung direkt ein Problem. Ich möchte die Felder, Methoden und Eigenschaften einer eigenen Klasse an zwei weitere Klassen vererben. Die Methode ist in der Elternklasse nicht implementiert, da diese bei den Kind Klassen unterschiedlich sein soll. Sowas nennt man dann wohl abstrakte Klasse soweit ich weiß!? Die ganze Sache sieht dann so aus:

Delphi-Quellcode:
type
  TBulkTransferThread = class(TThread)
  private
    { Private-Deklarationen }
    devHandle : PDXUSB_DEVICE;
    Data : Pointer;
    NumberOfBytes : ULONG;
    Status : Pointer;
  protected
    procedure Execute; override;
  public
    constructor create;
    property tdevHandle: PDXUSB_DEVICE read devHandle write devHandle;
    property tData: Pointer read Data write Data;
    property tNumberOfBytes: ULONG read NumberOfBytes write NumberOfBytes;
    property tStatus: Pointer read Status write Status;
  end;


  TBulkWriteThread = class(TBulkTransferThread)
  end;


  TBulkReadThread = class(TBulkTransferThread)
  end;


implementation

procedure TbulkWriteThread.Execute();
begin
...
   Ret := BulkWrite(...);//(edit) in einer eingebundenen Unit implementiere Funktion(/edit)
...
end;


procedure TbulkReadThread.Execute();
begin
...
   Ret := BulkRead(...);//(edit) in einer eingebundenen Unit implementiere Funktion(/edit)
...
end;
Nach meinen Recherchen müssten TBulkWriteThread und TBulkReadThread alles von TBulkTransferThread geerbt haben. Allerdings kommt während des Kompilierens bei der Implementierung die Fehlermeldung 'Unbekannter Bezeichner' für den Procedure-Namen und die darin benutzten Felder. Was mache ich falsch?

Vielen Dank
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#2

Re: Vererbung funktioniert nicht

  Alt 10. Okt 2007, 11:59
Hallo,

BulkWrite und BulkRead gibt es in TBulkTransferThread doch gar nicht.
Oder erbt dieses diese Methoden wiederrum von TThread? Kann das zur zeit nicht nachsehen.

Edit:
Ah, jetzt verstehe ich, worauf Du hinauswillst


Du musst diese Methoden schon in der Basisklasse deklarieren; nur das implementieren kannst Du Dir sparen

Als, deklariere sie als virtual; abstract in der Basisklasse, und in der Kindklasse dann mit 'override', also so:

Delphi-Quellcode:
   TBulkTransferThread = Class(TThread)
   private
      { Private-Deklarationen }
     devHandle : PDXUSB_DEVICE;
      Data: Pointer;
      NumberOfBytes: ULONG;
      Status: Pointer;
   protected
      Procedure Execute; override;
      Procedure BulkWrite; virtual; abstract;
   public
      Constructor create;
      property tdevHandle: PDXUSB_DEVICE read devHandle write devHandle;
      Property tData: Pointer read Data write Data;
      Property tNumberOfBytes: ULONG read NumberOfBytes write NumberOfBytes;
      Property tStatus: Pointer read Status write Status;
   End;

   TBulkWriteThread = Class(TBulkTransferThread)
   protected
      Procedure Execute; override;
      Procedure BulkWrite; override;
   End;
  Mit Zitat antworten Zitat
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#3

Re: Vererbung funktioniert nicht

  Alt 10. Okt 2007, 12:14
Sorry, ich habe mich etwas ungenau ausgedrückt
Das Problem liegt nicht bei BulkRead() und BulkWrite(). Die sind in einer Unit implementiert, welche ich in diese Unit einbinde. Habe die nur dahingeschrieben um anzudeuten, dass sich procedure TbulkWriteThread.Execute(); und procedure TbulkReadThread.Execute(); unterschieden sollen.

Und genau diese beiden Procedures, also: procedure TbulkWriteThread.Execute(); und procedure TbulkReadThread.Execute(); und die Felder tdevHandle usw. scheinen meine Kind Klassen nicht geerbt zu haben. Sie werden auch nicht unter Ansicht->Struktur angezeigt.

  Mit Zitat antworten Zitat
Astartes
(Gast)

n/a Beiträge
 
#4

Re: Vererbung funktioniert nicht

  Alt 10. Okt 2007, 12:33
Hi erstmal,

Von wo möchtest du dann auf die Methoden und Properties zugreifen? Wenn du von außen Zugreifen willst musst du BulkRead, BulkWrite und die Properties erst veröffentlichen in den vererbten Klassen!

Mfg Tom
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#5

Re: Vererbung funktioniert nicht

  Alt 10. Okt 2007, 12:41
Wenn sich die Execute der Kindklasse von der Execute der Basisklasse unterscheiden soll, dann musst Du diese in der Kindklasse ebenfalls als override deklarieren. Wenn Du das nicht tust, dann wird die Methode zwar geerbt, aber dann wird beim Aufruf die der Basisklasse genommen.

Als zusätzlicher Hinweis:
Felder, auf die in der Kindklasse direkt zugegriffen werden sollen, müssen in der Basisklasse mindestens die Sichtbarkeit 'Protected' haben, oder aber über entsprechende Properties 'veröffentlicht' werden.

Zur Sichtbarkeit sagt die Hilfe:
Zitat von BDS2006 Hilfe:
private-, protected-, public- und published-Deklarationen

Die Typdeklaration der Klasse kann drei oder vier Abschnitte enthalten, mit denen der Zugriff auf die Felder und Methoden der Klasse festgelegt wird:
Type
TClassName = Class(TObject)
public
{public-Felder}
{public-Methoden}
protected
{protected-Felder}


{protected-Methoden}
private
{private-Felder}
{private-Methoden}
end;
Im public-Abschnitt werden Felder und Methoden deklariert, die keinen Zugriffsbeschränkungen unterliegen. Klasseninstanzen und abgeleitete Klassen können auf diese Felder und Methoden zugreifen. Ein public-Element steht überall dort zur Verfügung, wo die Klasse sichtbar ist, zu der es gehört – d.h. in der Unit, in der die Klasse deklariert ist, sowie in allen anderen Units, die diese Unit verwenden.

Im protected-Abschnitt werden Felder und Methoden deklariert, die einigen Zugriffsbeschränkungen unterliegen. Ein protected-Element steht nur in der Unit zur Verfügung, in der die Klasse deklariert ist, sowie in allen Nachkommen der Klasse, unabhängig von der Unit der Nachkommenklassen.

Im private-Abschnitt werden Felder und Methoden deklariert, die strengen Zugriffsbeschränkungen unterliegen. Ein private-Element steht nur in der Unit zur Verfügung, in der es deklariert wurde. private-Elemente werden häufig innerhalb einer Klasse verwendet, um andere (public oder published) Methoden und Eigenschaften zu implementieren.

Bei Klassen, die von TPersistent abgeleitet sind, werden in einem published-Abschnitt Eigenschaften und Ereignisse deklariert, die zur Entwurfszeit verfügbar sind. Ein published-Element hat dieselbe Sichtbarkeit wie ein public-Element, aber der Compiler erzeugt Laufzeittypinformationen für die published-Elemente. published-Eigenschaften erscheinen zur Entwurfszeit im Objektinspektor.
Wenn Sie ein Feld, eine Eigenschaft oder eine Methode deklarieren, werden die neuen Elemente einem dieser vier Abschnitte hinzugefügt, womit ihre Sichtbarkeit festgelegt wird: private, protected, public oder published.
Edit: Eingangstext zur Sichtbarkeit abgeändert, da dieser missverstanden werden konnte.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Vererbung funktioniert nicht

  Alt 10. Okt 2007, 12:59
Seine properties waren schon im ersten Beitrag public - die sollte er so oder so erben. Er schrieb aber, dass er sie nicht geerbt hat. Aber da der Ausgangsquelltext doch schon alles richtig aufzeigt, warum belehrt ihr ihn über die Sichtbarkeit bei Vererbung?
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#7

Re: Vererbung funktioniert nicht

  Alt 10. Okt 2007, 13:08
Zitat von Muetze1:
Seine properties waren schon im ersten Beitrag public - die sollte er so oder so erben. Er schrieb aber, dass er sie nicht geerbt hat. Aber da der Ausgangsquelltext doch schon alles richtig aufzeigt, warum belehrt ihr ihn über die Sichtbarkeit bei Vererbung?
Weil ich in Erwägung gezogen habe, dass er vielleicht im Aufruf nicht auf die Property geht, sondern direkt auf das private Feld.
Deswegen habe ich nochmal auf die Sichtbarkeit hingewiesen.

Dass es letztendlich an der Execute-Methode lag, haben wir ja vorher schon klargestellt.
Tschuldigung, dass ich weiterührende Informationen gegeben, und diese nicht als solche gekennzeichnet habe - da bin ich wohl über das Ziel hinausgeschossen.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: Vererbung funktioniert nicht

  Alt 10. Okt 2007, 13:22
Zitat von s-off:
Tschuldigung, dass ich weiterührende Informationen gegeben, und diese nicht als solche gekennzeichnet habe - da bin ich wohl über das Ziel hinausgeschossen.
Dann muss ich mich auch entschuldigen, weil ich habe dies nicht so verstanden (als weiterführende Hilfe) und somit falsch gemeckert.
  Mit Zitat antworten Zitat
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#9

Re: Vererbung funktioniert nicht

  Alt 10. Okt 2007, 13:30
Erstmal vielen Dank an alle für eure Antworte.

So wie ich das verstanden habe, habe die Kindklassen jetzt wie folgt deklariert:

Delphi-Quellcode:
  TBulkWriteThread = class(TBulkTransferThread)
  protected
    procedure Execute; override;// <- Hier tritt der Fehler auf
  end;


  TBulkReadThread = class(TBulkTransferThread)
  protected
    procedure Execute; override;// <- Hier tritt der Fehler auf
  end;
Leider treten bei den Deklarationen Fehler auf:
[Pascal Fehler] My_Threads.pas(29): E2065 Ungenügende Forward- oder External-Deklaration: 'TBulkWriteThread.Execute'
[Pascal Fehler] My_Threads.pas(35): E2065 Ungenügende Forward- oder External-Deklaration: 'TBulkReadThread.Execute'

Habe ich das falsch verstanden?
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#10

Re: Vererbung funktioniert nicht

  Alt 10. Okt 2007, 13:32
Zitat von Viktorii:
Habe ich das falsch verstanden?
Nein

Deine Deklaration der Methoden ist schon korrekt - der Fehler rührt daher, weil sie noch nicht implementiert sind
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz