![]() |
OOP: Vererbung von Konstruktoren
Hi,
mal eine kleine Frage zu Konstruktoren. Ich habe eine Basisklasse:
Delphi-Quellcode:
(Der Konstruktor ist private, da die Klasse nur für Ableitungen ist und keine Instanz gebildet werden soll.)
TBase = class(TObject)
private FX : Integer; FY : Integer; constructor Create(X, Y: Integer); public property X: Integer read FX; property Y: Integer read FY; end; Meine Frage ist jetzt: Wenn ich weitere Klassen von TBase ableiten will, wie muss ich deren Konstruktoren gestalten?
Delphi-Quellcode:
Oder wie muss ich mir das vorstellen? Wenn ich keinen eigenen Konstruktor definiere, wird dann der von TBase genommen?
TSecond = class(TBase)
private public constructor Create(X, Y: Integer); end; constructor TSecond.Create(X, Y: Integer); begin inherited Create(X, Y: Integer): end; Ihr könnt mir sicher helfen (davon bin ich überzeugt...) :zwinker: Danke im Voraus. |
Re: OOP: Vererbung von Konstruktoren
Ja du solltest ihn auf alle Fälle aufrufen. Und auch in TBase solltest du
![]() |
Re: OOP: Vererbung von Konstruktoren
Zitat:
Zitat:
Hier stand absoluter Blödsinn. Ich sollte schlafen gehen. |
Re: OOP: Vererbung von Konstruktoren
Wie so besser? Das ist nun mal so. da gibt es kein besser oder schlechter. Wenn ich mit dem Auto fahren will, dann müssen sich die Räder auch drehen.
|
Re: OOP: Vererbung von Konstruktoren
Zitat:
Edit: Danke. Frage beantwortet. :thumb: |
Re: OOP: Vererbung von Konstruktoren
|
Re: OOP: Vererbung von Konstruktoren
Zitat:
Edit: Ja, Du hast recht. Danke. |
Re: OOP: Vererbung von Konstruktoren
Du kannst aber mit protected ins nächste offene Messer laufen...
Die (etwas schlampige) Implementierung von protected in Delphi ähnelt ein wenig dem internal aus c#. Alle protected Felder/Methoden sind für alle Klassen innerhalb der Unit sichtbar! |
Re: OOP: Vererbung von Konstruktoren
Zitat:
Warum kann ich die Privaten Felder einer Klasse (z.B. FBitmap: TBitmap) bei der Code-Vervollständigung sehen obwohl es entsprechende property-Elemente gibt? D.h. wenn ich auf MeineKlasse.Bitmap zugreifen will, zeigt er mir auch FBitmap an, obwohl als private deklariert. |
Re: OOP: Vererbung von Konstruktoren
Befindest du dich in der gleichen Unit? Innerhalb der gleichen Unit sind auch private Felder einer Klasse für andere sichtbar.
|
Re: OOP: Vererbung von Konstruktoren
Zitat:
|
Re: OOP: Vererbung von Konstruktoren
Mittlerweile sind die Constructors nicht mehr so wichtig. Habe soeben im eigenen Source mal gesucht. Die tauchen nur bei meinen eigenen Komponenten auf. Ist auch kein Wunder, denn das Create ist fast dasselbe.
ich modifiziere mal Dein Beispiel:
Delphi-Quellcode:
Soll nun der Wert von x und y mit 2 anfangen und z soll unberührt bleiben, so muß bereits in TBase.Create x und y auf 2 gesetzt werden. 8) So ungefähr läuft das. :zwinker:
TSecond = class(TBase)
private x,y : integer; public constructor Create; end; Constructor TBase.Create; begin x := 1; y := 1; z := 999; end; constructor TSecond.Create; begin inherited; // x und y erben die Werte von Vorfahrklasse, die durch inherited // aufgerufen wird, sind also jetzt jeweils 1 z ist jetzt 999 // x und y sollen 1 bleiben, z aber 1000 : z := 1000; // Entresult : x, y = 1, z = 1000 !!!! end; |
Re: OOP: Vererbung von Konstruktoren
Zitat:
Du kennst doch die typischen Fragen in der DP: "Gibt's 'ne Komponente hierfür?", "Gibt's 'ne Komponente dafür?", ... :roll: Da Delphi darauf abzielt VB'ler zu bekehren ist diese Implementierung gar nicht so unverständlich. ;) VB ist halt alles andere als OOP. :P Nachtrag: @Hansa, das ist jetzt nicht dein Ernst, oder? |
Re: OOP: Vererbung von Konstruktoren
Zitat:
|
Re: OOP: Vererbung von Konstruktoren
Zitat:
Ich denke, im Kopf eines Borland-Entwicklers geht etwas anderes vor. |
Re: OOP: Vererbung von Konstruktoren
@RG: was soll mein ernst sein ? Die OOP-Grundlagen zu erläutern ? :shock:
Zitat:
|
Re: OOP: Vererbung von Konstruktoren
Zitat:
|
Re: OOP: Vererbung von Konstruktoren
Zitat:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} type Base = class(TObject) private fX :Integer; fY :Integer; constructor Create(X, Y :Integer); public property X :Integer read fX; property Y :Integer read fY; end; Descendant = class(Base) private fZ :Integer; public property Z :Integer read fZ; constructor Create(X, Y, Z :Integer); end; { TBase } constructor Base.Create(X, Y :Integer); begin inherited Create(); fX := X; fY := Y; end; { TSecond } constructor Descendant.Create(X, Y, Z :Integer); begin inherited Create(X, Y); fZ := Z; // hier hätte er meckern sollen inc(fX); end; var x :string; begin with Descendant.Create(1, 2, 3) do try Writeln(X, ', ', Y, ', ', Z); finally Free(); end; Writeln('Zum Beenden bitte den Any-Key suchen... :P'); Read(x); end.
Code:
2, 2, 3
Zum Beenden bitte den Any-Key suchen... :P Zitat:
|
Re: OOP: Vererbung von Konstruktoren
Zitat:
|
Re: OOP: Vererbung von Konstruktoren
Zitat:
|
Re: OOP: Vererbung von Konstruktoren
Zitat:
|
Re: OOP: Vererbung von Konstruktoren
Beschimpfungen (per ICQ zu diesem Beitrag, bisher noch nicht hier im Forum) brauch ich nicht - dann lass ich es lieber bleiben hier mich zu äussern.
|
Re: OOP: Vererbung von Konstruktoren
Zitat:
|
Re: OOP: Vererbung von Konstruktoren
Zitat:
Und was Komponenten angeht so suche ich die nur selten. Lieber baue ich mir die selber. Da steckt auch viel OOP drin. |
Re: OOP: Vererbung von Konstruktoren
Zitat:
@Robert_G: Wenn man auf ein Konzept stößt, das einem das Gefühl vermittelt, man habe OOP besser verstanden als Anders H., dann sollte man vieleicht in sich gehen, und darüber nachdenken,ob man sich nicht gründlich auf dem Holzweg befindet. Delphi - Language (Objekt-Pascal) basiert auf einem sehr gut durchstrukturierten und sauber umgesetzten OOP - Konzept. Und es ist kein Kompromiß für OOP-Unfähige Entwickler. Man kann in Delphi zwar genau wie in C++(Builder), Java, oder C# zwar auch eine Menge erreichen, indem man Obejktbasiert statt Objektorientiert entwickelt, das läßt aber keine Rückschlüsse auf die Qualität des Grundkonzeptes zu. Und das ist in Delphi nach wie vor sehr gut. Im Gegenteil, die Möglichkeit, Komponenten durch verschiedene Techniken an einen bestimmten Zweck anzupassen statt immer sofort neue Klassen ableiten zu müssen ist gerade eine Stärke des Konzeptes. Es ist auch ein horrender Blödsinn, zu behaupten es gäbe hier irgendwelche Kompromisse, um VB-Entwicklern zu gefallen. Die Frage, gibt es eine Komponente hierfür oder dafür, zeigt lediglich daß jemand das Grundkonzept moderner Softwareentwickung verstanden hat (wenn vielleicht auch unbewußt), mit dem diese versucht, erwachsen zu werden. und versucht die Quote gescheiterter Projekte unter die 80% Marke zu drücken. Der goldene Grundsatz lautet, 'Never make it, if you can buy it'. Was glaubst du. was jeder Projektleiter oder Budgetverantwortliche der seinen Job versteht, einem Anwendungsentwickler erzählt, der eine Komponente, die er in einer halben Stunde downloaden und einsetzen kann, mit einem Aufwand von einer oder mehreren Mannwochen selbst entwickelt. Grüße Woki |
Re: OOP: Vererbung von Konstruktoren
Uff :shock: , das klang doch schlimmer als es tatsächlich gemeint war.
Mein rüder Tonfall kam wohl gestern durch eine Diskussion mit einem VB'Ler, der mir vorwerfen wollte: Ich arbeite ineffizient, weil ich eine WebControl-Abgeleitung gebastelt habe anstatt mein WebForm mit Repeatern zuzumüllen. (Es kostete mich fast unmenschliche Selbstbeherrschung, ihn deshalb nicht auszulachen.) @Topic Nachdem ich von 2 erfahrenen Delphianern hören musste, dass das Sinn macht muss ich mich natürlich geschlagen geben. Da war ich wohl gehörig auf dem Holzweg. :oops: Ein hübsche Implementierung ist es trotzdem nicht. Ein extra Access modifier á la internal wäre da ... "netter". p.s.: @Muetze, ärgere dich nicht über Hansa -> das bringt nix ;) Und zu deinem Einwand: Der Code hatte tatsächlich nicht viel mit OOP zu tun. Es ging mir eigentlich nur um das da:
Delphi-Quellcode:
p.p.s.: Ich glaube trotzdem, dass Delphi versucht VB'lern zu "gefallen". :mrgreen:
// hier hätte er meckern sollen
inc(fX); |
Re: OOP: Vererbung von Konstruktoren
Zitat:
Grüße Woki |
Re: OOP: Vererbung von Konstruktoren
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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