Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Vererbung von Eigenschaften
Claus - Mi 09.04.03 20:16
Titel: Vererbung von Eigenschaften
Hallo,
ich versuche mich mit objektorienter Programmierung (Anfänger).
Das Programm soll diverse geometrische Querschnittswerte ermitteln
Dazu habe ich erstmal ein Objekt TQuerschnitt definiert und davon verschieden Klassen abgeleitet (TKreis, TPolygon). Jetzt will ich in den Klassen z.B. die Fläche ermitteln und dann einheitlich weiterverwurschteln. Wie kriege ich denn die Werte in TQuerschnitt rein?
Ich habs so probiert:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| type TQuerschnitt = class(TObject) private Flaeche: single; public Bez: String; Loch: Boolean; ys,zs: single; ... function Iu: single;
type TKreis = class(TQuerschnitt) private Flaeche: single; function Flaeche: single; public ... property A: single read Flaeche; ....
implementation
function TKreis.Flaeche; begin result:= SQR(D)*PI/4-SQR(D-2*T)*PI/4; if Loch then result:= result*-1 end; ...
function TQuerschnitt.Iu; begin result := Iy-zs*zs*Flaeche end; |
Moderiert von
Aya: CodeTags hinzugefügt.
maximus - Mi 09.04.03 21:32
ja...das ist einfach :D
Das zauberwort heisst polymorphie und machen tut man das mit virtuellen methoden. Will heissen du definierst in der grund-klasse ein property:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| type TQuerschnitt = class(TObject) ... function getFlaeche:single; virtual; ... property Flaeche: single read getFlaeche; end; |
die funktion getFlaeche kann noch nix (gibt in dieser klasse 0 zurück). Jetzt kannst du beigehen und in den abgeleiteten klassen diese methode 'overriden':
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| type TKreis = class(TQuerschnitt) ... function getFlaeche:single; override; ... end; .. function TKreis.getFlaeche:single; begin result := 2*r*pi; end; |
So...die property musst du nur in der base-klasse definieren, welche dann die überschriebenen methoden, aus den jeweiligen klasse aufruft!
Hoffe es hilft?
Nightmare_82 - Do 10.04.03 01:12
brauchst virtual;abstract; für leere methoden, auf jeden Fall bei Delphi6
Claus - Do 10.04.03 06:42
Herzlichen Dank für die Hilfe. :D
maximus - Do 10.04.03 10:34
| Nightmare_82 hat folgendes geschrieben: |
| brauchst virtual;abstract; für leere methoden, auf jeden Fall bei Delphi6 |
Brauchen tut mans nicht...kann aber. Abstrakte klassen sinds aber für anfäger doch recht verwirrend :wink: Wenn du abstract benutzt müssen die methoden zwingend, in den folge-klassen, überschrieben werden!
Klabautermann - Do 10.04.03 11:31
Hallo,
du definierst in jeder Kasse eine Variable Flaeche vom Typ Single. Das ist nicht nötig, da diese je vererbt werden kann deklariere sie einfach im protected Block der Basisklasse, dann steht sie auch allen nachfahren zur verfügung:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| type TQuerschnitt = class(TObject) protected // nicht Private da es sonst auch vor nachfahren versteckt wird Flaeche: single; public Bez: String; Loch: Boolean; ys,zs: single; [...] |
desweiteren darfst du keile Funktion Flaeche deklarieren, wenn es schon eine Variable mit diesem Namen gibt:
Quelltext
1: 2: 3: 4:
| type TKreis = class(TQuerschnitt) private Flaeche: single; // Dies kann entfallen wenn du meinen Tipp von oben berücksichtigst. function Flaeche: single; // Das gibt einen Fehle nenne die Funktion BerechneFlaeche oder so ähnlich |
Gruß
Klabautermann
maximus - Do 10.04.03 11:40
IMHO braucht der gute die variable Flaeche garnicht, wenn er eine property fläche macht und flaeche, direkt mit getFlaeche, aus den geometrischen daten erzeugt....
Udontknow - Do 10.04.03 14:18
@Maximus:
Teilweise ist eine Pufferung aus Performancegründen sinnvoll (wenn dieses Property nun millionenmal abgerufen wird, sich die Fläche aber gar nicht ändert).
Cu,
Udontknow
maximus - Do 10.04.03 17:18
da muss ich dir leider recht sprechen :evil: hörte sich aber nicht so an, als wolle er irgendeine echtzeit-welt-maschinen-simulation machen :wink:
Claus - Do 10.04.03 19:34
Titel: noch nicht kapiert.
Hallo,
Danke für die rege Diskussion. Die Echtzeit-Weltmaschinen-Simulation ist tatsächlich erst mein übernächstes Projekt.
Momentan backe ich etwas kleiner Brötchen.
Also:
Der Weg mit der Definition der function getFlaeche in TQuerschnitt funktioniert bei mir. Allerdings mäkelt der Compiler, daß die Deklaration keine Funktion findet. Als muß ich eine Funktion definieren, die nichts weiter tut.
z.B.
function TQuerschnitt.GetFlaeche;
begin result := 0; end;
Richtig??
Dann ist das in möglicher Weg.
So wie die Variante mit der Vererbung der Variablen Flaeche funktioniert, so hatte ich mir das eigentlich vorgestellt. Mit dem protected-Block ist ein guter Hinweis. Aber wie du richtig anmerkst, kann ich keine Funktion Flaeche mehr definieren.
TKreis.Flaeche enthält erst mal nichts.
Wie kommt das Ergebnis von TKreis.BerechneFlaeche in Flaeche??
Irgendwie steh ich da am Schlauch.
Claus
maximus - Fr 11.04.03 10:53
Quelltext
1: 2: 3: 4:
| TKreis.BerechneFlaeche; begin Flaeche := xyz*$233+sqrt(power(bla)*muku); // :) end; |
Einfach direkt in flaeche reinrechnen! Du musst dann aber sicherstellen, dass dir variable Flaeche immer auf dem aktuellen stand ist...du musst quasi 'BerechneFlaeche' immer aufrufen, wenn du einen wert setzt. Das machst du am besten auch mit ner property, die eine Set-procedure hat. ZB:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type TKreis = class(TQuerschnitt) ... FRadius:single; // F... = field -> ist standart programmierweise! procedure SetRadius(value:single); ... Property Radius : single read FRadius write SetRadius; end; ... procedure TKreis.SetRadius(value:single); begin FRadius := value; BerechneFlaeche; end; |
so wird Flaeche immer geUpdatet wenn einen neuen Radius setzt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!