AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Klasse um eine funktion erweitern - Vererbung
Thema durchsuchen
Ansicht
Themen-Optionen

Klasse um eine funktion erweitern - Vererbung

Ein Thema von mumu · begonnen am 21. Sep 2005 · letzter Beitrag vom 26. Sep 2005
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#11

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 14:26
Zitat von GuenterS:
Zitat von shmia:
Zitat von tigerman33:
Wieso sollte das nicht funkionieren? Die neue Klasse erbt alles der Vorgängerklasse!
Weil niemand die procedure TJvZlibMultipleWithBreak.AddFile aufruft.
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.
Nein sie muss nicht als virtual deklariert sein, dass man sie überschreiben kann.
Falsch, die Methode der Basisklasse wird dann nur überdeckt. Bei einem Typecast oder - wie shmia schon gesagt hat - einem Aufruf über eine andere Methode der Basisklasse wird im Gegensatz zu virtual - override immer noch die verdeckte Methode aufgerufen.
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
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 14:35
Zitat von Khabarakh:
Zitat von GuenterS:
Zitat von shmia:
Zitat von tigerman33:
Wieso sollte das nicht funkionieren? Die neue Klasse erbt alles der Vorgängerklasse!
Weil niemand die procedure TJvZlibMultipleWithBreak.AddFile aufruft.
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.
Nein sie muss nicht als virtual deklariert sein, dass man sie überschreiben kann.
Falsch, die Methode der Basisklasse wird dann nur überdeckt. Bei einem Typecast oder - wie shmia schon gesagt hat - einem Aufruf über eine andere Methode der Basisklasse wird im Gegensatz zu virtual - override immer noch die verdeckte Methode aufgerufen.
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
Du hast anscheinend nicht verstanden was ich geschrieben habe. Das was Du in Deinem Beispiel zeigen wolltest, war klar. Es ging allerdings nicht darum.

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]
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#13

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 15:09
Zitat von GuenterS:
Du hast anscheinend nicht verstanden was ich geschrieben habe. Das was Du in Deinem Beispiel zeigen wolltest, war klar. Es ging allerdings nicht darum.
Doch, genau darum ging es .
Zitat:
[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]
Auch mit dem Rest liest sich dein Post eindeutig so, dass du shmia widersprechen wolltest. Ich wollte das nur klar stellen.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 15:18
Zitat von Khabarakh:
Zitat:
[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]
Auch mit dem Rest liest sich dein Post eindeutig so, dass du shmia widersprechen wolltest. Ich wollte das nur klar stellen.
Wenn man den Rest des Ausgangspostings mitliest wird man erkennen, dass dem nicht so ist.


Ich habe dort geschrieben:
Zitat von GuenterS:
Nein sie muss nicht als virtual deklariert sein, dass man sie überschreiben kann. Man kann sie danach trotzdem noch in der überschriebenen Methode über inherited oder sonstwo in der abgeleiteten Klasse über inherited Methodenname aufrufen.

Man muss eine Methode nur dann als virtual oder dynamic deklarieren, wenn man sie mittels override überschreiben möchte.
Damit habe ich lediglich behauptet, man die Ursprungsmethode innerhalb der überschriebenen diese mittels inherited aufrufen kann.

Wenn man meine beiden Sätze in zusammenhang liest (deshalb stehen sie wohl auch nebeneinander ), relativiert sich wieder der Anschein, dass ich shmia widerspreche. Allerdings nur deshalb weil sie/er und ich von ganz verschiedenen Dingen reden.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Benutzerbild von Grishnak
Grishnak

Registriert seit: 15. Sep 2005
Ort: Neu-Ulm
111 Beiträge
 
RAD-Studio 2009 Arc
 
#15

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 15:24
Die Eloquenz mancher User in diesem Forum verblüfft mich immer wieder...
Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#16

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 16:04
shmia schrieb, dass die Methode der abgeleiteten Klasse die virtuelle Methode der Basisklasse überschreiben muss, um überhaupt aufgerufen zu werden.
Zitat:
Nein sie muss nicht als virtual deklariert sein, dass man sie überschreiben kann.
Das klingt doch so, als ob sie auch so überschrieben wird, also in CompressFiles die überschreibende Methode aufgerufen wird. Auch danach schreibst du von überschriebenen Methoden ohne virtual, die eben nur verdeckt sind. Daraus kann man IMO schon einen gewissen Widerspruch lesen.

Aber lassen wir das, war ja nur ein Missverständnis .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 16:09
Zitat von Khabarakh:
shmia schrieb, dass die Methode der abgeleiteten Klasse die virtuelle Methode der Basisklasse überschreiben muss, um überhaupt aufgerufen zu werden.
Zitat:
Nein sie muss nicht als virtual deklariert sein, dass man sie überschreiben kann.
Das klingt doch so, als ob sie auch so überschrieben wird, also in CompressFiles die überschreibende Methode aufgerufen wird. Auch danach schreibst du von überschriebenen Methoden ohne virtual, die eben nur verdeckt sind. Daraus kann man IMO schon einen gewissen Widerspruch lesen.

Aber lassen wir das, war ja nur ein Missverständnis .
Gut lassen wir es dabei bewenden, nachdem ich noch angemerkt habe, dass man bitte vollständig zitiere, da es sonst leicht wie gesehen zu Sinnverzerrungen kommen kann.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 16:09
Och Leute is doch egal !!!

Wie Kedariodakon oben schon gepostet hat:
lies einfach mal diese Beiträge KLICK
Da wurd das super erklärt.
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#19

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 16:19
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?
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#20

Re: Klasse um eine funktion erweitern - Vererbung

  Alt 21. Sep 2005, 16:24
Zitat von DevilsCamp:
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?
Vielleicht will er/sie ja nicht das Verhalten aller seiner/ihrer jetztigen/zukünftigen Programme ändern, in dem er die Jedi Klasse ändert sondern nur gezielt ein einziges?

bzw. Wenn eine neue Version von den jedis rauskommt, könnte sie ihre Änderung nochmal machen.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 20:37 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