Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 12, 2025 21:47

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Wasserdichte Objekte
BeitragVerfasst: Sa Sep 27, 2008 21:29 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Sep 13, 2008 22:01
Beiträge: 3
Hallo Ihr,
ich versuche mich gerade in Free Pascal in Klassen/Objekten und habe eine Frage. Erstmal der Code

Code:
  1. program test02;
  2. {$mode objfpc}
  3. type
  4.   TPunkt = class
  5.     private
  6.       Fx: double;
  7.       Fy: double;
  8.       Fz: double;
  9.       procedure Setx(x: double);
  10.       procedure Sety(y: double);
  11.       procedure Setz(z: double);
  12.     public
  13.       property x: double read Fx write Setx;
  14.       property y: double read Fy write Sety;
  15.       property z: double read Fz write Setz;
  16. end;
  17. procedure TPunkt.Setx(x: double);
  18. begin
  19.   self.Fx := x;
  20. end;
  21. procedure TPunkt.Sety(y: double);
  22. begin
  23.   self.Fy := y;
  24. end;
  25. procedure TPunkt.Setz(z: double);
  26. begin
  27.   self.Fz := z;
  28. end;
  29. var
  30.   Punkt : TPunkt;
  31. begin
  32.   Punkt := TPunkt.Create;
  33.   Punkt.Setx(32456.234);
  34.   Punkt.Sety(54344.234);
  35.   Punkt.Setz(   12.345);
  36.   Punkt.Fx :=    0.000;
  37. //  Punkt.Fy :=    0.000;
  38. //  Punkt.Fz :=    0.000;
  39.   write ('Koordinate x:'); writeln (Punkt.x: 20: 2, ' m');
  40.   write ('Koordinate y:'); writeln (Punkt.y: 20: 2, ' m');
  41.   write ('Koordinate z:'); writeln (Punkt.z: 20: 2, ' m');
  42. end.
  43.  


Mit
Code:
  1. Punkt.Fx :=    0.000;

hab ich doch tatsächlich Zugriff auf private Felder :? Weiß jemand worans liegt?

Gruß und Dank


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Wasserdichte Objekte
BeitragVerfasst: Sa Sep 27, 2008 21:38 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Zitat:
Mit
Code:
  1. Punkt.Fx :=    0.000;

hab ich doch tatsächlich Zugriff auf private Felder :? Weiß jemand worans liegt?

Ja, weil die du das innerhalb von TPunkt machst; selbst wenn Punkt hier eine "fremde" TPunkt Variable ist, darfst Du in Memberfunktionen von TPunkt darauf zugreifen - private sagt soviel wie: sichtbar innerhalb dieser Klasse und nicht sichtbar innerhalb dieses Objektes. Hin und wieder ist das echt nützlich :-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 27, 2008 22:02 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Sep 13, 2008 22:01
Beiträge: 3
Danke für die prompte Antwort aber auch auf die Gefahr blöd zu Fragen: Wo ist denn die Grenze einer Klasse. Ich hab alles in einer Quellcode-Datei, ist es das. Ist die Includeanweisung die die Grenze darstellt ?

Gruß

cadrat


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 27, 2008 23:50 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Public=überall sichtbar
Published=eine speziell für das RTTI system eingeführte Sektion, um Informationen und methoden zur Laufzeit zu erreichen
private=innerhalb einer unit von allem zugreifbar, ausserhalb nicht sichtbar
protected=wie private nur dass abgeleitete Klasse auch ausserhalb der unit zugriff haben

Im normalfall sieht der Klassenaufbau wie folgt aus.
Public sind alle Properties und funktionen.
Protected sind alle set und get funktionen, die man für die public properties verwendet, sowie hilfsfunktionen.
Private braucht man für ganz spezielle dinge in einer Klasse, die Nachfahren nicht kennen brauchen(absoluter seltenfall für z.B. singleton patter).
Published braucht man nur für VCL, Scriptgesteuerte Klassen oder für z.B. Lade- und Speicherroutinen.
Zu 99% hantiere ich mit protected und public rum.

Kleiner Tip am Rande.
Um dir schreibarbeit zu sparen, nutzt nur Set und Get Methoden, wenn du mehr als nur die Variable zuweist oder abfragst, z.B. noch eine Hilfsfunktion oder ein Event aufrufst. Verwende immer ein Konstructor, indem du die Variablen mit einem festen Wert belegst.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: gelöst
BeitragVerfasst: Di Sep 30, 2008 20:06 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Sep 13, 2008 22:01
Beiträge: 3
Hallo Ihr,

das mit der Kapselung hab ich, denk ich hinbekommen. Meine Klasse liegt nun in einer Unit und wird aus einem Programm geladen. Geht.

Schwierigkeiten hannich nu mit dem Zugriff auf Felder aus einer Methode (TAK's Tip). Vielleicht mag ja jemand Querlesen wo mein Fehler liegt ...

Danke

Code:
  1.  
  2. //╒════════════════════════════════════════════════════════════════════╕
  3. //│ Modul                                                              │
  4. //╘════════════════════════════════════════════════════════════════════╛
  5. unit punkt;
  6. {$mode objfpc}
  7. //╒════════════════════════════════════════════════════════════════════╕
  8. //│ Schnittstelle                                                      │
  9. //╘════════════════════════════════════════════════════════════════════╛
  10. interface
  11. //uses
  12. type
  13.   TPunkt = class
  14.     private
  15.       Fx:  double;
  16.       Fy:  double;
  17.       Fz:  double;
  18.       procedure Setx(x: double);
  19.       procedure Sety(y: double);
  20.       procedure Setz(z: double);
  21.     public
  22.       constructor Create;
  23.       property x: double read Fx write Setx;
  24.       property y: double read Fy write Sety;
  25.       property z: double read Fz write Setz;
  26.       procedure SetKor(kx: double; ky: double; kz: double);
  27. end;
  28. //╒════════════════════════════════════════════════════════════════════╕
  29. //│ Implementation                                                     │
  30. //╘════════════════════════════════════════════════════════════════════╛
  31. implementation
  32. //╒═ construktor ══════════════════════════════════════════════════════╕
  33. constructor Tpunkt.Create;
  34. begin
  35.   inherited;
  36.   Fx := 0;
  37.   Fy := 1;
  38.   Fz := 2;
  39. end;
  40. //╒═ Eigenschaften ════════════════════════════════════════════════════╕
  41. procedure TPunkt.Setx(x: double);
  42. begin
  43.   self.Fx := x;
  44. end;
  45. procedure TPunkt.Sety(y: double);
  46. begin
  47.   self.Fy := y;
  48. end;
  49. procedure TPunkt.Setz(z: double);
  50. begin
  51.   self.Fz := z;
  52. end;
  53. //╒═ Methoden ═════════════════════════════════════════════════════════╕
  54. procedure SetKor(kx: double; ky: double; kz: double);
  55. begin
  56.   self.Fx := kx;
  57.   self.Fy := ky;
  58.   self.Fz := kz;
  59. end;
  60. //╒═ function ═════════════════════════════════════════════════════════╕
  61. //╒═ destructor ═══════════════════════════════════════════════════════╕
  62. end.
  63.  


Ich glaub ich hab's :D


Code:
  1. //╒═ Methoden ═════════════════════════════════════════════════════════╕
  2. procedure TPunkt.SetKor(kx: double; ky: double; kz: double);[/b]


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]