![]() |
[gelöst] Vererbung funktioniert nicht
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:
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?
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; Vielen Dank |
Re: Vererbung funktioniert nicht
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; |
Re: Vererbung funktioniert nicht
Sorry, ich habe mich etwas ungenau ausgedrückt :oops:
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. :?: |
Re: Vererbung funktioniert nicht
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 |
Re: Vererbung funktioniert nicht
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:
|
Re: Vererbung funktioniert nicht
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?
|
Re: Vererbung funktioniert nicht
Zitat:
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. |
Re: Vererbung funktioniert nicht
Zitat:
|
Re: Vererbung funktioniert nicht
Erstmal vielen Dank an alle für eure Antworte.
So wie ich das verstanden habe, habe die Kindklassen jetzt wie folgt deklariert:
Delphi-Quellcode:
Leider treten bei den Deklarationen Fehler auf:
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; [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? |
Re: Vererbung funktioniert nicht
Zitat:
Deine Deklaration der Methoden ist schon korrekt - der Fehler rührt daher, weil sie noch nicht implementiert sind :zwinker: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz