![]() |
Konstruktor
Hallo , ich schreibe morgen eine Klausur und mir ist eingefallen , dass ich etwas nicht kann.
Wenn ich eine Klasse habe und zum Beispiel in dieser Klasse die Eigenschaften x,y :integer habe auf private und eine zweite Klasse erschaffe , die von der ersten diese Eigenschaften erben soll , kann ich keine Methoden aufrufen. Also :
Delphi-Quellcode:
Ich weiß , das ist nicht richtig OOP , ist aber auch nicht "wichtig" , in der Klausur wird auf was anderes mehr gesetzt.
tgeo_objects = class
end; TViereck = class(Tgeo_objects) private x,y:integer; public procedure setx; procedure sety; function getx:integer; function gety:integer; end; TDreieck = class(TViereck) private x,y:integer; public procedure setx; procedure sety; function getx:integer; function gety:integer; Wenn ich jetzt zum Beispiel.
Delphi-Quellcode:
schreibe , dann erkennt er das nicht.
procedure tdreieck.setx
Ich habe ja auch noch keine Instanz von Tdreieck erzeugt , aber wie und wo erzeuge ich das , um x und y in der Dreieck Klasse zu manipulieren. Für Tviereck hatte ich eine Instanz erzeugt. Ist aber die Oberklasse und die Eigenschaften müssen nicht vererbt werden. Wo also muss ich
Delphi-Quellcode:
raufklatschen , damit er
mydreieck := Tdreieck.create
Delphi-Quellcode:
zum Beispiel erkennt ?
procedure tdreieck.setx
Danke schon im Voraus. |
AW: Konstruktor
Delphi-Quellcode:
tgeo_objects = class
end; TViereck = class(Tgeo_objects) private Fx,Fy:integer; public procedure setx( ax: Integer); procedure sety( ay: Integer); function getx:integer; function gety:integer; published property x: Integer read getx write setx; property y: Integer read gety write sety; end; TDreieck = class(TViereck) end; ... procedure TViereck.setx( ax: Integer); begin Fx = ax; end; ... |
AW: Konstruktor
Das mit
Delphi-Quellcode:
funktioniert ja bei mir , aber sobald ich x,y von Viereck vererbe kann ich mit dem Punkt-Operator
procedure Tviereck.setx
Delphi-Quellcode:
diesen Befehl nicht ausführen , da er sagt , dass x nicht erkannt wird , obwohl es ja vererbt wird
Tdreieck.setx
Delphi-Quellcode:
wie löse ich das blöde Problem ?
Tdreieck = class(tviereck)
|
AW: Konstruktor
Du weißt aber, was private, protected, virtual, override usw. bedeuten?
|
AW: Konstruktor
Bis jetzt hatten wir nur protected , private und public.
Spielt das eine Rolle für die Problemlösung , wenn ich fragen darf ? |
AW: Konstruktor
Ich denke schon, oder soll jede abgeleitete Klasse ihr eigenes SetX usw. haben? Wenn ja, wozu dann erben?
|
AW: Konstruktor
Naja , es muss doch möglich sein , wenn ich eine Klasse habe mit der Eigenschaft Bellen zum Beispiel , dass die zweite davon vererbte Klasse auch die Eigenschafte Bellen beeinhalten muss , oder ?
|
AW: Konstruktor
Also zum Einen hat mkinzler natürlich recht, deine Setter-Methoden können nicht funktionieren, da sie keinen Wert zugewiesen bekommen. Was sollen sie dann an die Felder FX, FY weiterleiten? Schau dir also mal den Unterschied zu deinem Quelltext an. Oder handelt es sich um geerbte Methoden von TGeo_Objects, die du uns hier nicht zeigst?
Zum Zweiten wird dir hier niemand helfen können, wenn du uns nicht den Quelltext des Implementation-Teils deiner Unit zeigst. Wo versuchst du denn deine Methoden aufzurufen? Bzw. wo erzeugst du denn die Objekte von TDreieck, mit denen du auf die propertys (die dir noch fehlen) zugreifen willst? Ja klar kannst du die Methoden vererben, dann solltest du dir aber mal die Begriffe virtual, dynamic und inherited anschauen. Der Titel hier lautet "Konstruktor", wo ist bei dir ein Constructor??? |
AW: Konstruktor
Ich weiß wo das Problem liegt , aber ich weiß nciht wie ich es beheben kann.
Ich muss doch erst von Dreieck eine INSTANZ mit dem KONSTRUKTOR-AUFRUF erstellen , damit ich z.B
Delphi-Quellcode:
benutzen kann.
procedure tdreieck.setx
Und dieses x ist in der Viereckklasse und Dreieck erbt von dieser Viereckklasse , also muss Dreieck automatisch auch die Variable x auf Integer haben ? |
AW: Konstruktor
Meinst Du sowas?
Delphi-Quellcode:
Var
MeinDreieck : TDreiEck; Begin MeinDreieck := TDreieck.Create; // Instantiiert |
AW: Konstruktor
Ich frage mich ernsthaft, was der Konstruktor mit der Setter-Methode zu tun haben soll und wieso man dazu eine Instanz haben muss, damit der Compiler das akzeptiert. Ich glaube, wir reden alle an einander vorbei.
|
AW: Konstruktor
Ja , das muss ich ja machen.
Aber wo ? Wenn ich das unter einen Button-ON-Click Event raufklatsche kann ich ja vorher keine Methoden benutzen :( |
AW: Konstruktor
Also nochmal!
Wenn du uns nicht verrätst, was du machen willst und du uns keinen Quelltext zeigst, dann können wir dir auch nicht helfen. Wo verwendest du denn deine Instanzen der Klasse TDreieck? Bisher schreibst du uns nur, frei übersetzt: "Ich muss ein Programm schreiben, was mache ich falsch" Du verlangst hellseherische Fähigkeiten von uns. Wir würden ja alle gern helfen. |
AW: Konstruktor
Okay , seht selbst bitte :
Delphi-Quellcode:
Hab den Fehler irgendwie behoben , x und y wird nur einmal bei TPunkt deklariert und die anderen Klassen kriegen x und y auch und können diese manipulieren mit set und get.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) PaintBox1: TPaintBox; Button1: TButton; Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Edit3: TEdit; Edit4: TEdit; Button2: TButton; Button3: TButton; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit; Edit8: TEdit; Edit9: TEdit; Label4: TLabel; Button4: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; tgeo_objects = class end; tpunkt = class(tgeo_objects) private x,y:integer; // HIER WIRD X UND Y DEKLARIERT AUF INTEGER NICHT RICHTIG OOP I KNOW end; TViereck = class(Tpunkt) public procedure setx; procedure sety; function getx:integer; function gety:integer; protected procedure zeichne; end; TDreieck = class(Tpunkt) protected procedure zeichnen; public procedure setx; procedure sety; function getx:integer; function gety:integer; end; TKreis = class (TDreieck) procedure Kreiszeichnen; private x1,y1,x2,y2:integer; public procedure setx1; procedure sety1; procedure setx2; procedure sety2; function getx1:integer; function gety1:integer; function getx2:integer; function gety2:integer; end; Tgeo_objectsArray = Array of Tgeo_objects; var Form1: TForm1; lange,breite:integeR; myviereck : Tviereck; mydreieck : Tdreieck; mykreis : Tkreis; GeoArray :Tgeo_objectsarray; implementation procedure addtoarray(Geoobject:tgeo_objects); begin SetLength(GeoArray, Length(GeoArray) + 1); GeoArray[High(GeoArray)] := GeoObject; end; procedure tviereck.setx; //setzen begin x:= strtoint(form1.Edit1.text); end; procedure Tviereck.sety; //setzen begin y:= strtoint(form1.edit2.Text); end; function Tviereck.getx; begin result :=x; end; function tviereck.gety; begin result:=y; end; procedure tdreieck.setx; //setzen begin x:= strtoint(form1.Edit3.text); end; procedure Tdreieck.sety; //setzen begin y:= strtoint(form1.edit4.Text); end; function Tdreieck.getx; begin result :=x; end; function tdreieck.gety; begin result:=y; end; procedure Tkreis.setx1; begin x1 := strtoint(form1.Edit5.Text); end; procedure Tkreis.sety1; begin y1 := strtoint(form1.edit6.text); end; procedure Tkreis.setx2; begin x2 := strtoint(form1.edit7.text); end; procedure Tkreis.sety2; begin y2:= strtoint(form1.Edit8.text); end; function tkreis.getx1; begin result := x1; end; function tkreis.gety1; begin result := y1; end; function tkreis.getx2; begin result := x2; end; function tkreis.gety2; begin result := y2; end; procedure TViereck.zeichne; begin form1.PaintBox1.Canvas.MoveTo(myviereck.getx,myviereck.gety); form1.paintbox1.canvas.LineTo(myviereck.getx+100,myviereck.gety); form1.paintbox1.canvas.lineto(myviereck.getx+100,myviereck.gety+100); form1.paintbox1.canvas.lineto(myviereck.getx,myviereck.gety+100); form1.paintbox1.Canvas.MoveTo(myviereck.getx,myviereck.gety); form1.PaintBox1.canvas.LineTo(myviereck.getx,myviereck.gety+100); end; procedure Tdreieck.zeichnen; begin form1.PaintBox1.Canvas.MoveTo(mydreieck.getx,mydreieck.gety); form1.PaintBox1.Canvas.LineTo(mydreieck.getx+100,mydreieck.gety); form1.PaintBox1.Canvas.MoveTo(mydreieck.getx,mydreieck.gety); form1.paintbox1.canvas.LineTo(mydreieck.getx,mydreieck.gety+100); form1.paintbox1.Canvas.MoveTo(mydreieck.getx,mydreieck.gety+100); form1.PaintBox1.Canvas.LineTo(mydreieck.getx+100,mydreieck.gety); end; procedure Tkreis.Kreiszeichnen; begin form1.PaintBox1.Canvas.Ellipse(x1,y1,x2,y2); end; procedure Farbe; begin if (form1.edit9.text) = ('rot') then begin form1.Color:=clred; end; end; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Myviereck := Tviereck.creatE; myviereck.setx; myviereck.sety; myviereck.zeichne; myviereck.free; end; procedure TForm1.Button2Click(Sender: TObject); begin mydreieck := tdreieck.Create; mydreieck.setx; mydreieck.sety; mydreieck.zeichnen; mydreieck.Free; end; procedure TForm1.Button3Click(Sender: TObject); begin mykreis := tkreis.Create; mykreis.setx1; mykreis.sety1; mykreis.setx2; mykreis.sety2; mykreis.Kreiszeichnen; mykreis.Free; end; procedure TForm1.Button4Click(Sender: TObject); begin farbe; end; end. |
AW: Konstruktor
Überleg mal was wohl private bedeutet und was public.
|
AW: Konstruktor
private ist doch dazu da , um Variablen etc abzukapseln , damit keiner Zugriff auf diese hat , damit keiner diese manipulieren kann.
Aber trotzdem müssen doch PRIVATE DEKLARIERTE VARIABLEN VERERBT WERDEN , oder nicht ? Sieht man doch an meinem Quellcode. |
AW: Konstruktor
Äaehmmm, irgendwie hat das ganz so gar nichts mit Objektorientierung zu tun ...
Designe Deine Klassen doch mal unabhängig von äußeren Einflüssen wie Form1, verpasse Ihnen eine Property Canvas oder übergebe diese beim Zeichenaufruf. Die Vererbung scheint mir auch etwas wild. |
AW: Konstruktor
Zitat:
So viel Beratungsresistenz bekommt man bis zur Klausur nicht mehr weg. Ausserdem ist alles falsch was wir sagen, sieht man ja an seinem Quelltext. Ich wünsche viel Glück bei der Klausur, vielleicht kommt ja nur "Singen und Klatschen" dran :mrgreen: |
AW: Konstruktor
Zitat:
Wie schon gesagt wurde, ist die Qodeformatierung zwar grauenhaft, aber egal. Schlimmer ist sowas. Das hab ich vor 'ner Weile schonmal gesehn. Selber Lehrer oder Dergleichen? Zitat:
Zitat:
z.B. wo kommen die Werte für setx1 her? Kein Resourcenschutzblock. Das Zeichnen auf einen Form-Canvas ist nicht resistent/haltbar, also ist das, was da gemacht wird, sinnlos und es müßte auch ins TForm.OnPaint nochmal mit rein. Die Ganze ausgeführte Routine würde so auch ganz gut in eine
Delphi-Quellcode:
oder
prozedur ZeichneKreis(x1, y1, x2, y3: Integer; Canvas: TCanvas);
Delphi-Quellcode:
passen. (was auch gut erkennbar macht, daß hier mit OOP eigentlich nicht viel los ist)
prozedur ZeichneKreis(Rect: TRect; Canvas: TCanvas);
|
AW: Konstruktor
Wie ich siehe, sind hier die meisten sehr gut in "destruktiver Kritik". Das bedeutet aber auch, das man das Problem nicht verstanden hat. Am OOP rumzumängeln (weiss er selbst, siehe Post #1) oder an der Codeformatierung, kommt dem Rauspicken von Rechtschreibfehlern gleich.
Das können die meisten der hier Anwesenden besser! Zumindest bei C# ist es so, das private Felder und Methoden in geerbten Klassen nicht verfügbar sind. Will man das, muss man sie als protected deklarieren. Meiner Meinung nach warst Du mit der Suche nach einem Konstruktor auf dem Holzweg. Aber nun ist ja die Klausur und es ist zu spät. |
AW: Konstruktor
Zitat:
|
AW: Konstruktor
Einen schönen guten Morgen liebe DP-Gemeinde,
erstmal zu HotKey, warum funktioniert 'seine' Vererbung nicht? Dazu eine kurze Anleitung, 'was' Vererbung ist: ![]() Allgemein möchte ich mit leiser Stimme vorschlagen, daß wir erstens: keine Hausaufgaben lösen, zweitens: nicht Retter in allerletzter Not spielen wollen, drittens: unsere Hilfe nicht erbeten werden sollte mit der Klausel: morgen habe ich eine Klausur zu schreiben, etc. viertens: ich denke, daß es Sinn macht, wenn die Fragenden ein kleines Beispielprogramm erzeugen, indem sie ihr Problem festmachen. fünftens: Fakt ist doch, wenn ich das, was nicht funktioniert auch nicht erklären kann, dann kann man doch nur das erklären, was nicht verstanden wird. Jetzt wieder mit normaler Stimme, Schöne Grüße aus Nürnberg, Manfred PS: Auch für mich war der Artikel von Delphi-Treff/Vererbung eine abwechslungsreiche Auffrischung. |
AW: Konstruktor
Zu dem gerade Angesprochenen hatte ich mir vor einiger Zeit auch schon Gedanken gemacht:
![]() |
AW: Konstruktor
@mz23
wobei das Beispiel in o.g. Link unter Umständen mehr zur Verwirrung als zur Erhellung beitragen könnte da Zugriffe wie:
Delphi-Quellcode:
in diesem Beispiel funktionieren, vielen Neulingen aber nicht bekannt sein dürfte, daß dies eine Ausnahme (imho ungerechtfertigterweise) ist welche nur funktioniert weil die Klassen in der selben Unit deklariert sind.
Chef.FNachname := 'Schmidt';
Chef.FBankleitzahl := 12345670; Chef.FGehalt := 10000; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 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