| Autor |
Beitrag |
Claus
Hält's aus hier
Beiträge: 7
|
Verfasst: Mi 09.04.03 20:16
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:
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
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Mi 09.04.03 21:32
ja...das ist einfach
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?
_________________ mfg.
mâximôv
|
|
Nightmare_82
      
Beiträge: 260
|
Verfasst: Do 10.04.03 01:12
brauchst virtual;abstract; für leere methoden, auf jeden Fall bei Delphi6
|
|
Claus 
Hält's aus hier
Beiträge: 7
|
Verfasst: Do 10.04.03 06:42
Herzlichen Dank für die Hilfe. 
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: 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  Wenn du abstract benutzt müssen die methoden zwingend, in den folge-klassen, überschrieben werden!
_________________ mfg.
mâximôv
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: 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
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: 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....
_________________ mfg.
mâximôv
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Do 10.04.03 17:18
da muss ich dir leider recht sprechen  hörte sich aber nicht so an, als wolle er irgendeine echtzeit-welt-maschinen-simulation machen 
_________________ mfg.
mâximôv
|
|
Claus 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Fr 11.04.03 10:53
_________________ mfg.
mâximôv
|
|