![]() |
Klasse um eine funktion erweitern - Vererbung
Hallo leute!
ich möchte die Klasse TJvZlibMultiple so erweitern, damit ich während des packvorgangs auch abbrechen kann. in der Function AddFile müsste ich da eine überprüfung einbauen, ob eine variable isBreakPressed auf true ist, um dann das packen abzubrechen. wie muss ich da vorgehen? hier ein ausschnitt der ursprünglichen klasse
Delphi-Quellcode:
und hier meine vererbte
TJvZlibMultiple = class(TJvComponent)
private ... protected procedure AddFile(FileName, Directory, FilePath: string; DestStream: TStream); procedure DoProgress(Position, Total: Integer); virtual; public constructor Create(AOwner: TComponent); override; function CompressFiles(Files: TStrings): TStream; overload; ... published ... end;
Delphi-Quellcode:
bei AddFile beschwert er sich: "Eine statische Methode kann nicht überschrieben werden"
type
TJvZlibMultipleWithBreak = class(TJvZlibMultiple) private isBreakPressed: boolean; public constructor Create(AOwner: TComponent); override; protected procedure AddFile(FileName, Directory, FilePath: string; DestStream: TStream); override; end; was mach ich falsch, bzw. besser gesagt bin ich da aufn richtigen weg, oder wie geh ich das an? danke schonmal |
Re: Klasse um eine funktion erweitern - Vererbung
"override" kannst du nur benutzten, wenn es sich um eine virtuelle Methode handelt!
Wenn du "override" weglässt, wird die Methode komplett überschrieben; du kannst aber immer noch per "inherited" auf die ursprüngliche Methode zurückgreifen!
Delphi-Quellcode:
TJvZlibMultipleWithBreak.AddFile(FileName, Directory, FilePath: string; DestStream: TStream);
begin [..eigener Code..] inherited; // <-- Aufruf der ursprünglichen Methode [..eigender Code..] end; |
Re: Klasse um eine funktion erweitern - Vererbung
jo hab ich mir schon auch gedacht, aber ich möchte ja eher wissen, wie ich das problem sonst angehen kann?
|
Re: Klasse um eine funktion erweitern - Vererbung
Oops, zu langsam editiert :| ! Schau dir mein obiges Posting nochmal an!
|
Re: Klasse um eine funktion erweitern - Vererbung
![]() ![]() ![]() ![]() ![]() :zwinker: Bei einem der vielen wirst du fündig... Und das könnte auch helfen: ![]() Oder einfach mal im Forum suchen... Bye |
Re: Klasse um eine funktion erweitern - Vererbung
Zitat:
Du solltest dein Anliegen als neues Feature auf ![]() vortragen. Am Besten gleich dazuschreiben, wie TJvZlibMultiple erweitert werden muss. Dann musst du keine neue Klasse ableiten; was sowieso nicht funktioniert, da es vom Design her nicht vorgesehen war. |
Re: Klasse um eine funktion erweitern - Vererbung
Wieso sollte das nicht funkionieren? Die neue Klasse erbt alles der Vorgängerklasse! Untested, aber so könnte es gehen:
Delphi-Quellcode:
type
TJvZlibMultipleWithBreak = class(TJvZlibMultiple) private FBreakPressed: boolean; protected procedure AddFile(FileName, Directory, FilePath: string; DestStream: TStream); virtual; public constructor Create(AOwner: TComponent); override; property BreakPressed: boolean read FBreakPressed write FBreakPressed; end; constructor TJvZlibMultipleWithBreak.Create(AOwner: TComponent); begin inherited; FBreakPressed := false; end; procedure TJvZlibMultipleWithBreak.AddFile(FileName, Directory, FilePath: string; DestStream: TStream); begin if not BreakPressed then inherited; end; |
Re: Klasse um eine funktion erweitern - Vererbung
Zitat:
Die procedure TJvZlibMultiple.AddFile müsste virtuell sein, damit die Prozedur aufgerufen wird. Die Klasse TJvZlibMultiple ruft ja aus CompressFiles die procedure AddFile auf. Dass es in einer abgeleiteten Klasse eine geänderte Procedure AddFiles gibt, das "weiss" TJvZlibMultiple.CompressFiles nicht. |
Re: Klasse um eine funktion erweitern - Vererbung
Zitat:
Man muss eine Methode nur dann als virtual oder dynamic deklarieren, wenn man sie mittels override überschreiben möchte. |
Re: Klasse um eine funktion erweitern - Vererbung
Was shmia uns sagen will, ist, dass andere Methoden von TJvZlibMultiple die intern "Add" aufrufen, eben von dieser "neuen" Add-Methode nichts wissen (können!) und deshalb immer die ursprüngliche Add-Methode aufrufen werden!
|
Re: Klasse um eine funktion erweitern - Vererbung
Zitat:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} uses SysUtils; type TBase = class public procedure Foo; procedure Bar; end; TDescendant = class(TBase) public procedure Bar; end; { TDescendant } procedure TDescendant.Bar; begin Writeln('TDescendant.Bar'); end; { TBase } procedure TBase.Bar; begin Writeln('TBase.Bar'); end; procedure TBase.Foo; begin Bar; end; var Descendant: TDescendant; begin Descendant := TDescendant.Create; Descendant.Foo; TBase(Descendant).Bar; Descendant.Free; Readln; end. Konsolenausgabe TBase.Bar TBase.Bar |
Re: Klasse um eine funktion erweitern - Vererbung
Zitat:
Delphi-Quellcode:
type
TBase = class protected procedure myMethod; end; TExtended = class(TBase) protected procedure MyMethod; end; implementation ... procedure TExtended.MyMethod; begin inherited; //<---- Hier wird die Methode von TBase aufgerufen end; .... end. [Edit] *grml* Habe schmia Beitrag wohl falsch gelesen, dachte sie/er meinte, dass man nur Methoden vererben kann, wenn man in der Mutterklasse virtual hinschreibt. Zusatz: Wenn Du meinen ganzen Beitrag zitiert hättest wäre das auch klar gewesen, dass ich was anderes meinte, man sollte/darf halt nicht immer nur die Teile zitieren die man für seine Aussagen braucht. [/Edit] |
Re: Klasse um eine funktion erweitern - Vererbung
Zitat:
Zitat:
|
Re: Klasse um eine funktion erweitern - Vererbung
Zitat:
Ich habe dort geschrieben: Zitat:
Wenn man meine beiden Sätze in zusammenhang liest (deshalb stehen sie wohl auch nebeneinander :gruebel: ), relativiert sich wieder der Anschein, dass ich shmia widerspreche. Allerdings nur deshalb weil sie/er und ich von ganz verschiedenen Dingen reden. |
Re: Klasse um eine funktion erweitern - Vererbung
Die Eloquenz mancher User in diesem Forum verblüfft mich immer wieder... :tongue:
|
Re: Klasse um eine funktion erweitern - Vererbung
shmia schrieb, dass die Methode der abgeleiteten Klasse die virtuelle Methode der Basisklasse überschreiben muss, um überhaupt aufgerufen zu werden.
Zitat:
Aber lassen wir das, war ja nur ein Missverständnis :cheers: . |
Re: Klasse um eine funktion erweitern - Vererbung
Zitat:
|
Re: Klasse um eine funktion erweitern - Vererbung
Och Leute is doch egal !!!
Wie Kedariodakon oben schon gepostet hat: lies einfach mal diese Beiträge ![]() Da wurd das super erklärt. |
Re: Klasse um eine funktion erweitern - Vererbung
Back to Topic
Da es sich ja um eine Jedi-Klasse handelt, wieso änderst du die Klasse nicht direkt anstatt eine neue Klasse davon abzuleiten? |
Re: Klasse um eine funktion erweitern - Vererbung
Zitat:
bzw. Wenn eine neue Version von den jedis rauskommt, könnte sie ihre Änderung nochmal machen. |
Re: Klasse um eine funktion erweitern - Vererbung
Dann sollte dies gleichzeitig als Änderungsvorschlag an die Entwickler gesendet werden ;)
|
Re: Klasse um eine funktion erweitern - Vererbung
Zitat:
|
Re: Klasse um eine funktion erweitern - Vererbung
Um mich da jetzt auch mal einzumischen, wo ist denn das Problem, wenn er diese kleine Änderung bei seiner Version dieser Komponente einbaut? :gruebel: Es ist doch nicht so, als würde dadurch das Verhalten unglaublich verändert... Er muß eben nur diese zusätzliche Eigenschaft im Konstruktor der Komponente mit false initialisieren, dann ändert sich bei Projekten, bei denen er diesen Wert nicht nutzt Nullkommagarnüscht. :roll:
|
Re: Klasse um eine funktion erweitern - Vererbung
Bei dieser einen Änderung wird er wohl keine Probleme bekommen, außer dass er sie vielleicht bei jedem update der JEDIs wiederholen darf.
Wenn man aber generell jede kleine Änderung, mal hier en bissi, dort ein bissi, ändert, wird man irgendwann eine Version haben die man gar nicht mehr so leicht updaten kann. Da sich durch das Update ja auch der Ursprungscode ändern wird (hoffentlich denn sonst wars update umsonst). |
Re: Klasse um eine funktion erweitern - Vererbung
Darf ich mal zum Thema "funktioniert ja nicht wegen virtual" anmerken, dass ich die Methode doch schon als virtual deklariert hatte? Damit wird, auch beim internen Aufruf der Methode, nämlich sehr wohl die überschriebene Methode aufgerufen.
|
Re: Klasse um eine funktion erweitern - Vererbung
Intern im Sinne innerhalb einer Methode der abgeleiteten Klasse?
Wenn dem so ist solltest du inherited davor schreiben. |
Re: Klasse um eine funktion erweitern - Vererbung
Nein, intern im Sinne von Aufruf innerhalb einer geerbten Methode der abgeleiteten Klasse. inherited bringt da nichts, es geht ja darum, die überschriebene Methode in die VMT einzutragen. :???:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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