![]() |
Komponente von TCustomSocket ableiten?
Moin,
ich habe ein Problem und zwar möchte ich eine Komponente schreiben (abgeleitet von TCustomSocket), das Problem ist nun, das es bei meiner Nachfolger-Komponente direkt vor dem Erzeugen des Form1's zu einem "Abstrakten Fehler"(EAbstractError) kommt. Die Frage: Was kann ich da jetzt tun? Ich möchte auf keinen Fall von TClientSocket ableiten, da dort die meisten Properties (die ich in meiner Komponente einfach nicht brauche) bereits published sind. Vielleicht habt ihr ja eine Idee ;) MfG Mario |
Re: Komponente von TCustomSocket ableiten?
Moin!
Der Fehler kommt daher, weil der TCustomSocket abstrakte Methoden enthält die du in deiner Ableitung überschreiben musst. Wenn du dies nicht tust und den Socket instanziierst und er auf eine solche Methode zugreift (oder einfach nur findet??), dann gibt es diese Exception. MfG Muetze1 |
Re: Komponente von TCustomSocket ableiten?
Tag Muetze,
muss ich auch Code in diesen überschriebenen Methoden einfügen oder reicht es wenn ich sie "Nur" überschreibe? |
Re: Komponente von TCustomSocket ableiten?
Moin!
Es reicht die entsprechenden Methoden zu überschreiben - die Methode selber kann leer bleiben. MfG Muetze1 |
Re: Komponente von TCustomSocket ableiten?
Moin Mütze,
besten Dank ;) Könntest du mir noch erklären was der Sinn von abstrakten Methoden sein soll? Ich meine die Methoden selbst könnte man ja trotzdem einfach in einem Nachfolger deklarieren, wozu wird die vorher schon definiert? |
Re: Komponente von TCustomSocket ableiten?
Damit du alle Nachfahren unter der abstrakten Basisklasse zusammenfassen kannst. ;)
Abstrakten Member versichern dir, dass der NAchfolger eine eigene Implementierung mitbringt. Leere Rümpfe wären absoluter Blödsinn. Wenn die Methode beim Instanzieren, Verbinden, whatever von TCustomSocket benutzt wird, dann wird sie nunmal gebraucht. ;) |
Re: Komponente von TCustomSocket ableiten?
Wenn es Blödsinn ist die Rümpfe leer zu lassen, woher wüsste ich dann was in selbige an Code einzufügen ist?
|
Re: Komponente von TCustomSocket ableiten?
Naja...wenn du mit Sockets arbeitest, dann könnte man z.B. davon ausgehen, dass du ein Socket für ein best. Protokoll machen willst. Jedes Protokoll sendet beim Verbinden andere Daten, und genau das musst du eben machen ;)
Sieh dir am besten mal die Sourcen zu Server- und Clientsocket an... Greetz alcaeus |
Re: Komponente von TCustomSocket ableiten?
Moin!
Abstrakte Methoden bieten dir z.B. den Vorteil das du eine Basisklasse bauen kannst die schon alles kann. So kannst du z.B. das Empfangen von Daten schon aufrufen und mit den Daten umgehen in der Basisklasse aber das Empfangen als abstrakte Methode deklarieren. Dadurch kannst du den Socket schon programmieren ohne dich auf das Wie und Wo des Empfangens festzulegen. Das müssen denn die Ableitungen machen - einfach nur noch die Daten ermitteln und zurückgeben - egal wodrüber. Man könnte z.B. eine Ableitung von einem TCustomSocket machen und alles über DDE laufen lassen anstatt einem WinSocket. Aber die Verwaltung, Umgang mit den Daten etc. ist schon alles im TCustomSocket implementiert, Details kommen in der Ableitung. Ohne abstrakte Methode könnte die Basisklasse z.B. nicht sagen: Ich lese mir die Daten ein - weil es keine Methode zum Aufrufen gibt. und eine virtuelle bringt einem nix, da die Basisklasse da nix reinschreiben könnte, da sie sich nicht um das Wie und Wo kümmert. Und eine virtuelle Methode bringt in dem Zusammenhang die Fehlerquelle mit, das Ableitungen vielleicht vergessen ihre Empfangsroutine zu implementieren und schon funktioniert es nicht... MfG Muetze1 |
Re: Komponente von TCustomSocket ableiten?
hallo muetze, danke für eine erklärung.
Könntest du - wenn du lust hast - mir ein kleines beispiel schreiben wo eine abstrakte methode z.b gebraucht wird? Ich kapier sowas immer ein bisschen schwer, wenn ich Code sehe eher leichter :( MfG EDIT: Ich glaub ich habs nun doch kapiert ;) abstract; ist für soetwa, richtig?
Delphi-Quellcode:
Also wenn eine Methode aus der Basisklasse eine andere Methode benötigt, richtig?
unit Unit2;
interface uses SysUtils; type TMainClass = class private function calculate(const a, b: integer): Integer; virtual; abstract; public function anotherfunc: string; end; TSubClassMult = class(TMainClass) private function calculate(const a, b: integer): Integer; override; end; TSubClassAdd = class(TMainClass) private function calculate(const a, b: integer): Integer; override; end; implementation { TMainClass } function TMainClass.anotherfunc: string; begin Result := IntToStr(calculate(9, 9)); end; { TSubClassMult } function TSubClassMult.calculate(const a, b: integer): Integer; begin Result := a * b; end; { TSubClassAdd } function TSubClassAdd.calculate(const a, b: integer): Integer; begin Result := a + b; end; end. |
Re: Komponente von TCustomSocket ableiten?
Moin!
Deine letzte Frage verstehe ich nicht, aber das Beispiel ist ein gutes Beispiel dazu. So kannst du in der Basisklasse z.b. die komplette Funktionalität implementieren und alle Aufrufe etc schon einbauen, aber wie es dann später genau implementiert wird bzw. wie gerechnet wird, hängt dann von der abgeleiteten Klasse ab. MfG Muetze1 |
Re: Komponente von TCustomSocket ableiten?
Moin Muetze,
mit meiner letzten Frage meinte ich, das Methoden die als "abstract;" definiert sind, in selbiger Klasse ja irgendwo aufgerufen werden, richtig? |
Re: Komponente von TCustomSocket ableiten?
Moin!
Ob sie aufgerufen werden ist die andere Frage, aber zumindest "... aufgerufen werden können", ja. MfG Muetze1 |
Re: Komponente von TCustomSocket ableiten?
Moin,
also für mich machen abstrakte methoden sonst keinen wirklichen sinn als eben wenn sie in der eigenen klasse bereits aufgerufen werden. Denn wozu wäre sie dann vorher als abstract definiert worden wenn sie nicht unbedingt gebraucht wird? |
Re: Komponente von TCustomSocket ableiten?
Moin!
Zitat:
Du könntest damit auch Entwickler zwingen eine Procedure zu implementieren um auf irgendwas hinzuweisen bzw. eine Procedure zu implementieren die in der Basisklasse nicht gebraucht wird aber in jeder Ableitung genutzt werden muss... Ist an den Haaren herbei gezogen und mir fällt kein Beispiel ein, aber wie ich oben schon geschrieben hatte: Du hast vollkommen Recht damit... - ich wollte nur darauf hinweisen das es kein Zwang ist - im Gegensatz zu dem Zwang die Methode zu implementieren in einer Ableitung... MfG Muetze1 |
Re: Komponente von TCustomSocket ableiten?
Gut :) Danke nochmal für die Erklärung ;)
|
Re: Komponente von TCustomSocket ableiten?
Abstrakte Methoden kannst du dir ähnlich wie Interfaces vorstellen. Wer immer sie implementiert geht eine Art Vertrag mit dir ein.
Damit du die Ableitung benutzen kannst muss sie sich an die Vereinbarung halten und diese Funktionalität implementieren. Member, die für diese Vereinbarung unnütz sind, abstrakt zu deklarieren wäre natürlich totaler Blödsinn und würden das ganze Konzept ad absurdum führen. :? Wenn ich abstrakte Member sehe, gehe ich davon aus, dass ich sie implmentieren muss. Wenn sie der Autor nur aus Jux abstrakt deklariert hat würde ich ihm bei nächster Gelegenheit mit Anlauf in den Hintern treten. :evil: |
Re: Komponente von TCustomSocket ableiten?
Zitat:
|
Re: Komponente von TCustomSocket ableiten?
Wurde eigentlich schon folgender wichtige Grund für Abstraktion genannt? Also:
Man kann - grob gesagt - eine abstract-Methode von TVater aufrufen kann und er guckt automatisch, welchen Typ die aufrufende Instanz besitzt. Abhängig davon, ob die Instanz vom Typ TKind1, TKind2 oder TKind3 ist, wird dann die Implementation der aufgerufenen Methode beim passenden Kind ausgeführt. Das ist ![]() |
Re: Komponente von TCustomSocket ableiten?
Moin!
Nein, das erreiche ich auch mit einer puren virtuellen/dynamischen Methode - nur das ich dort nicht die Sicherheit habe, das die Nachfahren die Methode implementieren. MfG Muetze1 |
Re: Komponente von TCustomSocket ableiten?
Zitat:
Aber: Zitat:
Der Unterschied ist, dass wenn der Nachfahre die Methode nicht implementiert hat, es bei abstract zu einem Laufzeitfehler kommt, während bei nur-virtuell die beim Vorfahren dann zwangsläufig vorhandene (und dem Nachfahren vererbte) Methode abgearbeitet wird. Wenn man ![]() |
Re: Komponente von TCustomSocket ableiten?
Moin!
Zitat:
Zitat:
MfG Muetze1 |
Re: Komponente von TCustomSocket ableiten?
Zitat:
Daher auch meine danach folgende Aussage: Zitat:
|
Re: Komponente von TCustomSocket ableiten?
Zitat:
Seitdem ist das ganze für mich erledigt und ich verwende "virtual" statt "abstract" und schreibe notfalls in der Ur-Klasse nur :
Delphi-Quellcode:
Seitdem ist Ruhe.
begin end;
|
Re: Komponente von TCustomSocket ableiten?
@Hansa
Das war doch ein ParadeBeispiel für einen Grund einer abstrakten Methode. Deine nachträgliche Lösung ist das Paradebeispiel für schlechtes Code design. :mrgreen: |
Re: Komponente von TCustomSocket ableiten?
Dummschwätzer. :mrgreen: Kümmere dich besser um deinen Oracle-Mist. :lol:
|
Re: Komponente von TCustomSocket ableiten?
Wenn ich eine leere virtuelle Funktion statt einer abstrakten nehme ists doch viel leichter mal zu übersehen, dass man die überschreiben wollte.
Nimm eine abstrakte und der Kompiler meldet dann: Instanz von 'X' mit der abstrakten Methode 'Y' wird angelegt. |
Re: Komponente von TCustomSocket ableiten?
So ist es. Ätsch :mrgreen: @RG
|
Re: Komponente von TCustomSocket ableiten?
Zitat:
|
Re: Komponente von TCustomSocket ableiten?
Zitat:
Außerdem beschreibst du im Rest deines Postings genau diesen Fall doch auch selbst :roll: : Er stößt auf eine abstract-Methode und fällt mit Fehler auf die Nase, was bei sinnvoller Anwendung von abstract ja auch gewünscht ist. Dass dir die Stille einer leeren virtual-Methode lieber ist, als der klare Hinweis auf eine fehlerhafte Klassenprogrammierung, wundert mich nun schon etwas. |
Re: Komponente von TCustomSocket ableiten?
Zitat:
Und wenn wir schon dabei sind : wo liegt der entscheidende Vorteil, ohne die Nachteile in Kauf zu nehmen ? |
Re: Komponente von TCustomSocket ableiten?
Das dürfte in jedem 2. Beitrag hier stehen. :roll: (oder anders ausgedrückt: Jedem, der nicht von dir ist. :mrgreen: )
|
Re: Komponente von TCustomSocket ableiten?
Zitat:
Nun, wenn man beim sinnvollen Gebrauch von abstract-Methoden die Warnungen des Compilers nicht in den Wind schlägt, ist das möglich, bzw. der Fehler dürfte gar nicht erst passieren. Zitat:
Ne, ne, dann lieber eine klare Fehlermeldung, die mir deutlich sagt: Mit dieser Klasse stimmt was nicht! Zitat:
|
Re: Komponente von TCustomSocket ableiten?
Moin!
Ach, Diskussionen mit Hansa sind immer wieder witzig und mich muss mich hier allen (ausser Hansa) mal anschliessen: Die abstrakten Methoden haben vor allem Vorteile und bisher sehe ich keine direkten Nachteile. Warnungen und Hinweise sind neben Fehlern eine wichtige Ausgabe des Compilers und sollten/müssen wahrgenommen werden. Und eins kann ich dazu sagen: Wenn einer stillschweigend irgendwo mal Begin/End; hinschreibt weil er mit abstrakten Methoden nicht umgehen kann, dann ist dies schon grob fahrlässig. Da suchen nachher vielleicht 2 Programmierer fast 3 Tage um so eine leere Funktion zu finden um dann festzustellen, das ein anderer in der Ableitung mit der Methode nix gemacht hat. So ein teuren Spass wird sich keine Firma zweimalig leisten. Derjenige darf danach entweder nur noch Dokumente klammern oder Kaffee kochen - je nachdem welcher der vorherigen Ex-Programmierer woanders eine Stelle gefunden haben... :mrgreen: . MfG Muetze1 |
Re: Komponente von TCustomSocket ableiten?
Hi Theoretiker :
programmiert eine abstrakte Klasse. Dann leitet ihr davon eine andere ab und noch 2 weitere. Immer schön abstrakt. :mrgreen: Und dann baut ihr irgendwo mittendrin etwas nicht definiertes ein. Und dann ? 8) Abstrakte Klassen sind hier im Hause jedenfalls zum Eigenbedarf wegen Sinnlosigkeit durchgefallen. Thats it. |
Re: Komponente von TCustomSocket ableiten?
Moin!
Zitat:
Ausserdem haben die 2. und 3. Ableitung nix mehr mit den abstrakten Methoden der Basisklasse am Hut, da sie die erste Ableitung implementiert. In den Ableitungen 2 und höher kannst du machen was du willst - ableiten oder auch nicht... Zitat:
MfG Muetze1 |
Re: Komponente von TCustomSocket ableiten?
@Mütze : nicht rumoren. 8) "Abstract" trägt nicht dazu bei, etwas zu verbessern. Also los : wo liegt der definitive Vorteil davon. Erwarte Antwort. :mrgreen:
|
Re: Komponente von TCustomSocket ableiten?
Moin!
Zitat:
Der definitive Vorteil: Du hast als Basisklassenprogrammierer die Sicherheit, das die Methode implementiert wird in der Ableitung - ausser natürlich man schlägt alle Warnungen und Hinweise des Compilers in den Wind... MfG Muetze1 |
Re: Komponente von TCustomSocket ableiten?
Versuch einem Blinden nicht das Sehen zu erklären, Muetze. Ich glaube, er WILL es nicht verstehen :? .
|
Re: Komponente von TCustomSocket ableiten?
Zitat:
Oder aus einer anderen Richtung betrachtet: Ist eine Klassenfamilie erst einmal sinn-, ziel- und funktionsgerecht fertig programmiert, so ist es dem Programmierer, der sie einsetzt, wurscht, ob abstrakte Methoden darin vorkommen oder nicht. Sie tut, was sie soll, und gut. Die Verwendung von abstract soll und kann aber dem Klassenprogrammierer bei der Entwicklung (und Erweiterung) dieser Klassenfamilie helfen, überhaupt da hin zu kommen, nämlich sie fehlerfrei zu gestalten. Und wenn sie fehlerfrei ist, so kommt es auch zu keinen Abstract-Fehlern, die man debuggen müsste. Ich verstehe daher, Hansa, deine Sorgen bzgl. des "Debuggen von abstrakten Methoden" nicht. a.) Als Programmierer, der eine fertige Klassenfamilie in seinem Projekt einsetzt, sagt dir ein Abstract-Error, dass die Klassen Schrott sind, weil der Klassenprogrammierer wohl geschlafen hat. Sei dann froh, dass es dir gemeldet wurde, nimm es zur Kenntnis, und verzichte auf die Klassen. b.) Als Klassenprogrammierer sagt dir ein dabei auftauchender Abstract-Error, dass du Mist gebaut hast. Sei dann froh, dass es dir gemeldet wurde, nimm es zur Kenntnis und korrigiere deine Klassen, damit sie anständig funktionieren. Somit ist doch der Abstract-Error in jedem Fall eine Hilfestellung zur fehlerfreien Programm- und Klassenerstellung. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 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-2025 by Thomas Breitkreuz