AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein OOP - Zugriff von Objekten untereinander
Thema durchsuchen
Ansicht
Themen-Optionen

OOP - Zugriff von Objekten untereinander

Ein Thema von Viktorii · begonnen am 17. Jun 2011 · letzter Beitrag vom 17. Jun 2011
Antwort Antwort
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#1

OOP - Zugriff von Objekten untereinander

  Alt 17. Jun 2011, 14:12
Moin.

Hab da mal ne konzeptionelle Frage. Um ein möglichst einfaches Beispiel zu nennen sagen wir mal ich habe die Objekte ObjectA, ObjectB und ObjectC. ObjectC ist ein Member von ObjectB und ObjectB ist ein Member von ObjectA.
Also so (ohne die restlichen Memberfunktionen):
Delphi-Quellcode:
type
  TMyClassA = class(TObject)
  private
    ObjectB: TClassB;
  public

  end;


  TClassB = class(TObject)
  private
    ObjectC: TClassC;
  public

  end;


  TClassC = class(TObject)
  private

  public

  end;
Wenn nun aber ObjectA und ObjectC miteinander kommunizieren sollen (also ObjectA ruft Memberfunktionen von ObjectC auf) muss ich ja für jede Meberfunktion in ObjectB eine 'Durchreichfunktion' schreiben.

Das kann im wahren Leben sehr viel und unübersichtlich werden.

Eine Lösung wäre ObjectC in ObjectB pulic zu setzen. Dann könnte ObjectA direkt auf ObjectC zugreifen. Aber man soll Felder ja nie pulbic machen.

Wie löst man das am elegantesten?
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#2

AW: OOP - Zugriff von Objekten untereinander

  Alt 17. Jun 2011, 14:48
Lassen wir mal die Diskussion über Sinn und Unsinn dieser Querzugriffe beseite, empfehle ich Dir mal die verschiedenen Sichtbarkeiten genauer nachzulesen

private, protected ...
Zitat:
In general, most data and methods internal to a class should be defined in a Protected section. This gives subclasses often useful access to these. Only use Private when you are sure that you want to keep stuff entirely local to the current class/unit.
Geht also auch ohne public, aber wie Du schon sagst, sollte man nicht so unbedingt, überlege vielleicht mal, ob Du Deine Klassen anders definieren kannst, so daß sie weniger Abhängigkeiten voneinander haben.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#3

AW: OOP - Zugriff von Objekten untereinander

  Alt 17. Jun 2011, 14:52
Wenn nun aber ObjectA und ObjectC miteinander kommunizieren sollen (also ObjectA ruft Memberfunktionen von ObjectC auf) muss ich ja für jede Meberfunktion in ObjectB eine 'Durchreichfunktion' schreiben.
Wenn A direkt mit C kommunizieren soll, sollte A vielleicht C kennen.
Dafür könntest du in B einen Getter schreiben oder aus B heraus eine Funktion von A mit Argument C aufrufen.

Wenn du in geben willst/kannst/darfst, wäre etwas Kontext nicht schlecht: Was sind A, B und C für Objekte?
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: OOP - Zugriff von Objekten untereinander

  Alt 17. Jun 2011, 14:59
Man kann (je nach den gegebenen Umständen) ein privates Feld auch als Eigenschaft zugänglich machen (property).

So könntest Du ein Objekt als solches als read only öffentlich machen.

Delphi-Quellcode:
type
  TMyClassA = class(TObject)
  private
    FObjectB: TClassB;
  public
    property ObjectB: TClassB read FObjectB;
  end;

Ein Unterobjekt öffentlich zu machen, muss ja nicht verkehrt sein.
Im Beispiel könnte man kein anderes Objekt zuweisen.

Schreib evtl. mal mehr zu Deinem Problem...


EDIT: TEdit.Font ist ja auch nichts anderes.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (17. Jun 2011 um 15:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.626 Beiträge
 
Delphi 12 Athens
 
#5

AW: OOP - Zugriff von Objekten untereinander

  Alt 17. Jun 2011, 15:01
Im Beispiel könnte man kein anderes Objekt zuweisen.
Aber man könnte es freigeben. Das kann natürlich gewollt sein, trotzdem sollte man diesen Umstand im Hinterkopf behalten.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#6

AW: OOP - Zugriff von Objekten untereinander

  Alt 17. Jun 2011, 15:17
Nach Meinung einer der OOP-Gurus wäre aber genau das, was du beschrieben hast die Lösung. Da A C nicht kennt, darf A C nicht vertrauen und ergo dort auch nichts aufrufen.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#7

AW: OOP - Zugriff von Objekten untereinander

  Alt 17. Jun 2011, 15:25
Da A C nicht kennt, darf A C nicht vertrauen und ergo dort auch nichts aufrufen.
Was aber die Frage aufwirft, warum A Methoden von C benutzen soll und ob die fraglichen Stellen in A dann nicht eher in eine öffentliche Methode von B gehören.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: OOP - Zugriff von Objekten untereinander

  Alt 17. Jun 2011, 15:34
@mquadrat

Wenn aber noch dutzende andere Klassen ein ObjectC verwenden, dann wird das Ganze recht aufwendig.

Man kann die durchgereichten Methoden natürlioch in eine Include-Datei legen und diese in allen Klassen verwenden (vorausgesetzt, die Variable heißt auch überall "ObjectC"). So spart man sich viel Schreiberei, aber die Methoden "müllen" natürlich dann die Memberliste der Klassen zu (tauchen immer in der Codevervollständigung auf).

Wenn es keinen zwingenden Grund für solch eine Durchreichung gibt (z.B. wenn ausdrücklich nur ein paar ausgewählte ObjectC-Methoden verfügbar sein sollen), würde ich es als Eigenschaft öffentlich machen.

@BUG

Nimm doch z.B. mal Edit.Font. Da ist doch Font auch komplett zugänglich.
Wozu sollte man hier Edit.FontSize einführen? Ich würde dies nur machen, wenn es wirklich zwingende Gründe dafür gibt.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#9

AW: OOP - Zugriff von Objekten untereinander

  Alt 17. Jun 2011, 16:48
@stahli

Sehe ich ähnlich. Zumal das Risiko sinkt, wenn die Klassen vom gleichen Autor kommen Ich würde mich da auch eher für die Bequemlichkeit als für die reine Lehre entscheiden.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: OOP - Zugriff von Objekten untereinander

  Alt 17. Jun 2011, 16:55
Ist etwas schwierig, das so global ohne konkretes Fallbeispiel zu beurteilen. Wie schon das Beispiel von Stahli zeigt, gibt es durchaus plausible Gründe gibt, das Law of demeter nicht zu erzwingen. Andererseits ergibt sich daraus eine Abhängigkeit, die du eventuell gerade dadurch, dass A nicht C kennt, vermeiden willst (denn wenn du in A dann Self.B.C aufrufst, hast du nix gewonnen). Somit wäre zu überlegen, was genau will denn A in deinem Fall von C? Wäre es nicht besser, eine Methode auf B aufzurufen, die dann weiter an C delegiert?

Beispiel, was für das LoD immer wieder herangezogen wird, ist das paper boy example.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (17. Jun 2011 um 16:58 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 14: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