AGB  ·  Datenschutz  ·  Impressum  







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

virtual / override ??

Ein Thema von Hansa · begonnen am 19. Aug 2004 · letzter Beitrag vom 21. Aug 2004
Antwort Antwort
Seite 4 von 5   « Erste     234 5      
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#31

Re: virtual / override ??

  Alt 20. Aug 2004, 01:33
Wie gesagt, die Prozeduren bleiben bei mir nicht komplett leer, deshalb brauche ich das abstract nicht.

Allerdings habe ich nun noch folgendes bemerkt : dekllariere ich eine Methode als virtual, so wird die abgeleitete Methode nicht ausgeführt (die ebenfalls als virtual deklariert ist). Deklariere ich die abgeleitete dagegen als "override", so wird sie ausgeführt.

Hierüber müßte ich schon Klarheit haben.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#32

Re: virtual / override ??

  Alt 20. Aug 2004, 01:46
Lies bitte nochmal meinen Post Hansa - dort ging ich auf alle Deine Fragen ein.
Noch ein Beispiel für Override (Konstruktoren etc. weggelassen):
Delphi-Quellcode:
TMensch = Class(TObject)
  FGroesse : Integer;
  FGeburtstag : TDateTime;
  FAugenfarbe : TColor;
  FVorname : String;
  FName : String;
public
  procedure Assign(Value: TMensch); virtual; // nicht abstrakt, da echte Funktionalität
                                             // darin steckt
  property Groesse : Integer read FGroesse write FGroesse;
  property Geburtstag : TDateTime read FGeburtstag write FGeburtstag;
  property Augenfarbe : TColor read FAugenfarbe write FAugenfarbe;
  property Vorname : String read FVorname write FVorname;
  property Name : String read FName write FName;
end;

TFrau = class(TMensch)
FAnzahlSchuhe : LongInt; // :-)
FGeburtsName : String;
public
  procedure Assign(Value: TMensch); override; // damit wir die in TMensch erledigte
                                              // Arbeit hier wiederverwenden können
  property AnzahlSchuhe : LongInt read FAnzahlSchuhe write FAnzahlSchuhe;
  property GeburtsName : String read FGeburtsName write FGeburtsName;
end;

TMann = class(TMensch)
FAlimenteZahler : Boolean;
public
  procedure Assign(Value: TMensch); reintroduce; // kein "override" (!), löscht bzw. verdeckt
                                                 // die ererbte Methode. Um CompilerWarnung
                                                 // zu unterdrücken, Angabe von "reintroduce"
  property AlimenteZahler:Boolean read FAlimenteZahler write FAlimenteZahler;
end;

implementation

procedure TMensch.Assign(Value:TMensch);
begin
  FGroesse := Value.Groesse;
  FGeburtstag := Value.Geburtstag;
  FAugenfarbe := Value.Augenfarbe;
  FVorname := Value.Vorname;
  FName := Value.Name;
end;

procedure TFrau.Assign(Value: TMensch);
begin
  inherited Assign(Value); // Groesse etc. wird abgelegt
                           // geringer Aufwand hier, da Vorfahrklasse die Arbeit erledigt
  if (Value is TFrau) then begin
    FAnzahlSchuhe := TFrau(Value).AnzahlSchuhe;
  end else raise Exception.Create('Dieser Mensch ist keine Frau!');
end;

procedure TMann.Assign(Value: TMensch);
begin
  // wir können die ererbte Methode TMensch.Assign nicht aufrufen,
  // da die TMann.Assign-Methode diese verdeckt! Also müssen wir uns
  // hier erneut um den Kram kümmern:
  FGroesse := Value.Groesse;
  FGeburtstag := Value.Geburtstag;
  FAugenfarbe := Value.Augenfarbe;
  FVorname := Value.Vorname;
  FName := Value.Name;
  if (Value is TMann) then begin
    FAlimenteZahler := TMann(Value).AlimenteZahler;
  end else raise Exception.Create('Dieser Mensch ist kein Mann!');
end;
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#33

Re: virtual / override ??

  Alt 20. Aug 2004, 01:49
@nailor: Du liegst leider falsch -das weglassen von override verhindert eben den ererbten Aufruf der Vorfahrmethode - sie wird also verdeckt - nur wenn override angegeben wird, hat man in dem abgeleiteten Objekt über "inherited" (engl. für "ererbt") noch die Zugriffsmöglichkeit auf die Methode des Vorfahrobjektes.
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#34

Re: virtual / override ??

  Alt 20. Aug 2004, 02:01
Nun mal schön langsam. gaaaanz langsam. 8) Ich deklariere eine Methode also als "virtual". Insofern will ich sie vererben. Im Falle von "override" scheint es so zu sein, daß sie ersatzlos gestrichen wird und durch einen neuen Inhalt ersetzt wird.

Was nun, wenn ich in der Basisklasse schreibe i := 1; und dann noch ein paar Initialisierungen vornehme. In einer abgeleiteten Klasse soll alles bleiben, wie es ist, nur i := 2; soll gemacht werden. In diesem Fall nützt es wenig, alles andere ersatzlos zu streichen.

Was ist dann zu tun ?
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#35

Re: virtual / override ??

  Alt 20. Aug 2004, 02:02
Zitat von Leuselator:
@nailor: Du liegst leider falsch -das weglassen von override verhindert eben den ererbten Aufruf der Vorfahrmethode - sie wird also verdeckt - nur wenn override angegeben wird, hat man in dem abgeleiteten Objekt über "inherited" (engl. für "ererbt") noch die Zugriffsmöglichkeit auf die Methode des Vorfahrobjektes.
Gruß
wenn du dir mal meinen post anschaust, wirst du feststellen, das sich die erste hälfte und die zweite irgendwie wiedersprechen. ich weiß auch nicht, wie ich dazú kam, es zu posten, aber die erste hälfte ist müll. bzw. mit reintruduce statt override eingesetzt würde sie zwar noch sinn machen, aber naja, der post war nicht das gelbe vom ei...
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#36

Re: virtual / override ??

  Alt 20. Aug 2004, 09:46
Zitat von Hansa:
Nun mal schön langsam. gaaaanz langsam. 8) Ich deklariere eine Methode also als "virtual". Insofern will ich sie vererben. Im Falle von "override" scheint es so zu sein, daß sie ersatzlos gestrichen wird und durch einen neuen Inhalt ersetzt wird.
Wenn du eine virtuelle Methode als "override" deklarierst, ersetzt diese bei der aktuellen Klasse die Methode mit dem Namen, das ist richtig. Aber: über "inherited" hast du noch die Möglichkeit, die Methode der Vorgängerklasse aufzurufen. Die Möglichkeit hast du bei "reintroduce" bzw. wenn du gar nichts angibst nicht.

Zitat von Hansa:
Was nun, wenn ich in der Basisklasse schreibe i := 1; und dann noch ein paar Initialisierungen vornehme. In einer abgeleiteten Klasse soll alles bleiben, wie es ist, nur i := 2; soll gemacht werden. In diesem Fall nützt es wenig, alles andere ersatzlos zu streichen.

Was ist dann zu tun ?
Ich nehm mal an, i sei ein Objektfeld oder eine globale Variable: Dann rufst du zuerst die Funktionen der übergeordneten Klassen auf (per inherited). Hier wird alles initialisiert und i auf 1 gesetzt. Nun setzt du noch i auf 2, und fertig.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#37

Re: virtual / override ??

  Alt 20. Aug 2004, 11:52
Eventuell auch mal einen Blick in das entsprechende Tutorial von mir werfen, obwohl so detailiert bin ich darauf nicht eingegangen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#38

Re: virtual / override ??

  Alt 20. Aug 2004, 12:29
es geht weiter :

reintroduce fast abgehakt, sofern das hier so stimmt:

ich erweitere Leusels Bsp. um ein Adoptivkind (Kanzler sei Dank 8) ), von dem das Geburtsdatum nicht genau feststeht. Sagen wir, es ist ein Mädchen, also vom Typ TFrau. In diesem Fall ist das Geburtsdatum irrelevant. TFrauAdoptiv soll nur das Geburtsjahr beinhalten. Ich steige also mit "reintroduce" neu in die Vererbungskette ein. Also TMensch -> TFrau -> TFrauAdoptiv als "reintroduce", was dann allerdings bedeutet, daß alle bereits in TMensch und danach deklarierten Eigenschaften neu definiert (zumindest initialisiert) werden müssen

dynamic abgehakt, wegen Überflüssigkeit.

overload nicht abgehakt

Ist zwar soweit klar, aber ich habe mir das MessageDlg mal näher angesehen. Das ist auch "overload", d.h. die Parameterliste wird flexibel. Nun stellt sich für mich folgende Frage :

Mich hat immer schon gewundert, daß "writeln" egal war, ob ein integer, ein string oder sonstwas angezeigt werden sollte. Geht das Overload in diese Richtung ?


noch was ?
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#39

Re: virtual / override ??

  Alt 20. Aug 2004, 12:36
overload: mehere namensgleiche funktionen, die allerdings unterschiedliche datentypen erwarten. z.b. kannst du display für strings und ints proggen und überladen. wird dann display mit einem string aufgerufen, machst du showmessage(string), bei einem int machst du showmessage(inttostr(int)). natürlich könntest du auch kommplett unterschiedliche sachen machen...
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#40

Re: virtual / override ??

  Alt 20. Aug 2004, 12:55
@Hansa verdeckt: siehe Zeilen 31ff und 58ff in meinem letzten Codebeispiel!
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


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 13:16 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