AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OOP Frage

Ein Thema von kurtm1 · begonnen am 23. Apr 2006 · letzter Beitrag vom 23. Apr 2006
Antwort Antwort
Seite 1 von 2  1 2      
kurtm1

Registriert seit: 12. Dez 2003
348 Beiträge
 
#1

OOP Frage

  Alt 23. Apr 2006, 10:28
Habe mir ein paar Beispiele zur OOP angesehen, und dabei ist folgende Frage aufgetreten:

Also es wir ganz normal eine Klasse deklariert, die bei den private Deklarationen einige Methoden hat. Diese Methoden geben nur ein einfachen Zahlenwert zurück. Bei den Public Deklarationen gibts dann einige properties, die bei "Read" dann die Methoden der Private Deklarationen aufrufen.

Was macht das für einen Sinn über eine Variable den Funktionswert zu bekommen, und nicht direkt die Funktion aufzurufen?
  Mit Zitat antworten Zitat
markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#2

Re: OOP Frage

  Alt 23. Apr 2006, 10:32
Du kannst umgekehrt auch Werte setzen Lassen, und dabei evtl. ungültig gewordene Werte in der Instanz gleich löschen.
Asonsten müsstest du zuerst den Wert setzen und dann eine womöglich private prozedur/funktion aufrufen.
Mal ganz davon abgesehen, dass du so die Möglichkeit hast, Werte einfach zu locken indem du sagst, wird nicht mehr beschrieben.

mfG

Markus

EDIT: Oder umgekehrt den Zugriff auf die Variable zu verbieten, solange intern an ihr Gearbeitet wird ...
Markus
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: OOP Frage

  Alt 23. Apr 2006, 10:32
Doe Properties werden nur deklariert um im OI angezeigt zu werden, so daß man sie hierüber manipulieren kann.
Markus Kinzler
  Mit Zitat antworten Zitat
kurtm1

Registriert seit: 12. Dez 2003
348 Beiträge
 
#4

Re: OOP Frage

  Alt 23. Apr 2006, 10:34
Das mit dem Werte reinschreiben ist klar, aber wenn ich für eine property nur read habe, zahlt sich das ja nicht aus oder?
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: OOP Frage

  Alt 23. Apr 2006, 10:37
@mkinzler

Dazu müßten sie aber im published-Bereich stehen.

Gruß Hawkeye
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#6

Re: OOP Frage

  Alt 23. Apr 2006, 10:38
Properties sind der OOP-Weg auf die Eigenschaften (wie der Name schon vermuten lässt), sprich den Status der Instanz zuzugreifen. Direkte Feldzugriffe von außerhalb des Objekts sollten vermieden werden und stattdessen über Properties gekapselt werden. Da gewisse Aspekte dieses Objektstatus sich aber ja zur Laufzeit sehr dynamisch ändern können, gibt es die Möglichkeit mit den Gettermethoden den entsprechenden Wert quasi "on-demand" zu berechnen.
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: OOP Frage

  Alt 23. Apr 2006, 11:12
Um zur Abwechslung mal Deine Frage zu beantworten. Wenn es um das LEsen einer Eigenschaft geht und Du nur einen Wert eines vorhandenen Feldes zurückgeben willst, dann kannst Du dieses Feld direkt bei read eintragen und brauchst dafür keinen extra "Getter". Alles andere ist OOP-Puristik und Geschmackssache.

......

P.S.: Aber der Titel Deiner Frage könnte schon aussagekräftiger sein
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

Re: OOP Frage

  Alt 23. Apr 2006, 12:12
Hi,

Also hier ist mal mein Lieblingsbeispiel.

Delphi-Quellcode:
TBeispiel = class
 private
  FLeben: Integer;
  FTot: Boolean;
  function GetLeben: Integer;
  function SetLeben(const Value: Integer);
 public
  property Tot: Boolean read FTot;
  property Lebensenergie: Integer read GetLeben write SetLeben;
 end;

function TBeispiel.GetLeben: Integer;
begin
 Result := FLeben;
 { Ob nicht einfach Read FLeben reicht darüber kann man sich in dem Beispiel streiten^^}
end;

procedure TBeispiel.SetLeben(const Value: Integer);
begin
 if Value > 0 then // Wenn HP > 0
  FLeben := Value // Dann FLeben auf neuen Wert setzen
 else
 if Value <= 0 then // Wenn HP <= 0
 begin
  FLeben := 0; // Dann FLeben auf 0 setzen
  FTot := true; // und die Einheit als Tot erklären
 end;
end;
Damit kann man relativ gut erkennen wofür Properties gut sind. In der Set-Methode wird nicht einfach nur der neue Wert gesetzt (Dann könnte man theoretisch ja auch einfach nur Variablen benutzen) sondern es wird je nach Situation anders gehandelt.
Beispiel 1b:

Delphi-Quellcode:
var Test: TBeispiel;

procedure Ka;
begin
 Test := TBeispiel.Create;
 if not Test.Tot then ShowMessage('Einheit lebt noch!');
 Test.Leben := -10;
 ShowMessage('Lebensenergie: ' + IntToStr(Test.Leben));
 if Test.Tot then ShowMessage('Einheit ist tot!');
end;
Wie du siehst musstest du nirgendwo Test.Tot := true setzen. Was auch nicht gehen würde weil es eine Readonly-Property ist.
Ich hoffe du hast jetzt verstanden wie das funktioniert und was für Vorteile sich daraus ergeben. Und ich hoffe ich habe die Frage richtig verstanden und das hier nicht umsonst geschrieben

Gruß
Neutral General
Michael
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#9

Re: OOP Frage

  Alt 23. Apr 2006, 12:29
Wofür ist das Feld FTot gut? Warum nicht einfach so:
Delphi-Quellcode:
private
  ...
  function GetTot: Boolean;
public
  property Tot: Boolean read GetTot;
  property Lebensenergie: Integer read GetLeben write SetLeben;
end;

...
function TBeispiel.GetTot: boolean;
begin
  Result := Lebensenergie = 0;
end;
//edit:
Da sieht man ja auch gleich ein gutes Beispiel für eine Gettermethode.

// 2. edit:
Wobei die ursprüngliche Frage damit natürlich nicht gelöst ist--eine public Funktion würde es ja genauso tun...
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#10

Re: OOP Frage

  Alt 23. Apr 2006, 14:04
Zitat von tigerman33:
Wobei die ursprüngliche Frage damit natürlich nicht gelöst ist--eine public Funktion würde es ja genauso tun...
Hi,
natürlich tut es eine Kombination von öffentlichen Gettern und Settern auch. Das man komplett ohne Properties auskommt, zeigt z.B. Java, auch hier gibt es im BDK einen Property Editor, der kommt nah an den Objektinspektor ran, verwendet aber keine direkten Properties. [OT] Der parst einfach nur, ob es zu einer Variablen Methoden mit der Bezeichnung "setVariablenname" oder "getVariablenname" existieren [/genug OT]

Jedenfalls gibt es kein Muss für properties. Sie können einfach verwendet werden, weil es nun mal schöner ist auf eine Variable zuzugreifen. Wenn ich setVar und getVar habe, so sind dies zwei verschiedene Methoden, ich muss also je nachdem ob ich lesen oder schreiben möchte die richtige Methode verwenden. Verwendet man properties, so kann man halt ein und den selben Bezeichner sowohl zum Lesen als auch Schreiben verwenden.

Ob das nun die Rechtfertigung ist oder nicht, darüber lässt sich sicherlich streiten, aber das muss ja nicht sein. Immerhin bleibt jedem die freie Wahl was er präferiert.

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz