AGB  ·  Datenschutz  ·  Impressum  







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

Interfaces und Properties

Offene Frage von "Windwalker"
Ein Thema von Windwalker · begonnen am 25. Nov 2010 · letzter Beitrag vom 25. Nov 2010
Antwort Antwort
Windwalker

Registriert seit: 9. Mär 2009
72 Beiträge
 
#1

Interfaces und Properties

  Alt 25. Nov 2010, 15:03
Delphi-Version: 2010
Hallo zusammen,

ich entwerfe gerade einiges Klassen und zugehörige Interfaces.
Wie verhält es sich denn mit Properties und deren Setter- und Getter-Methoden in Bezug auf Sichtbarkeit?

Als Beispiel hier folgendes kleine Interface und eine implementierende Klasse aufgeführt:
Delphi-Quellcode:
IMyInterface = Interface
  function get_Feld: string;
  procedure set_Feld(s: string);
  property Feld: string read get_Feld write set_Feld;
end;

TMyClass = class(IMyInterface)
private
  fFeld : string;
  function get_Feld: string;
  procedure set_Feld(s: string);
public
  property Feld: string read get_Feld write set_Feld;
Die Deklaration der Property im Interface verlangt ja auch die Deklaration der Getter- und Setter-Methoden im Interface.
Meine Frage nun:
Hat das "Private" denn nun noch eine Auswirkung auf die Sichtbarkeit der Getter- und Setter-Methoden oder werden sie durch die Deklaration im Interface automatisch "public"?

Wäre ja blöd...
Mein Kollege meint, dem wäre so, denn das sei ein Design-Problem von Delphi.

Danke für die Hilfe!

Geändert von mkinzler (25. Nov 2010 um 15:15 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Interfaces und Properties

  Alt 25. Nov 2010, 15:09
Was wäre der Sinn davon ein Interface zu haben das versteckte Methoden hat?
Greifst du über das Interface auf die Klasse zu sind die Getter/Setter immer sichtbar.
Greifst du über das Objekt zu dann gelten die dortigen Sichtbarkeiten der Methoden.

AFAIK gibt es keine Sprache die Interface mit private/protected Methoden unterstützt.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Interfaces und Properties

  Alt 25. Nov 2010, 15:14
Bei einem Interface ist alles so, als wäre es Public.

Ich hatte mir mal, zur Lösung dieses Problemchens, Folgendes überlegt, wärend ich damals die Interfaces für mein himXML zusammenstellte.
Delphi-Quellcode:
IMyInterfaceInternal = Interface
  function get_Feld: string;
  procedure set_Feld(s: string);
end;

IMyInterface = Interface(IMyInterfaceInternal)
  property Feld: string read get_Feld write set_Feld;
end;

TMyClass = class(TInterfacedObject, IMyInterface)
private
  fFeld : string;
  function get_Feld: string;
  procedure set_Feld(s: string);
public
  property Feld: string read get_Feld write set_Feld;
@Bernhard Geyer:
Für micht ergab dieses ein übersichtlicheres Interface, vorallem bei der Autovervollständigung von Delphi.
$2B or not $2B

Geändert von himitsu (25. Nov 2010 um 15:17 Uhr)
  Mit Zitat antworten Zitat
Windwalker

Registriert seit: 9. Mär 2009
72 Beiträge
 
#4

AW: Interfaces und Properties

  Alt 25. Nov 2010, 15:20
Was wäre der Sinn davon ein Interface zu haben das versteckte Methoden hat?
Damit nicht direkt auf die Getter/Setter zugegriffen werden kann und man beim Instanzieren und Verwenden der Objekte gezwungen ist, über die Properties die Felder zu setzen und auszulesen.

wenn ich *nicht* von einem Interface ableite, ist das ja auch genau der Sinn hinter der Property.

Greifst du über das Interface auf die Klasse zu sind die Getter/Setter immer sichtbar.
Greifst du über das Objekt zu dann gelten die dortigen Sichtbarkeiten der Methoden.
Das habe ich mir fast so gedacht.
Eigentlich ist letzterer Fall der wünschenswerte.
Getter/Setter versteckt, alleinige Schnittstelle nach außen ist das Property.
Da ich ja aber auch den Vorteil des Reference Counting mir zunutze machen will, muss ich das Objekt als InterfacedObject instanzieren.
Und dann sind die Getter und Setter wieder sichtbar.


Bei einem Interface ist alles so, als wäre es Public.

Ich hatte mir mal, zur Lösung dieses Problemchens, Folgendes überlegt, wärend ich damals die Interfaces für mein himXML zusammenstellte.
 ... Code entfernt ...
Dadurch sind die Getter und Setter aber immer noch nicht private, oder?
Weil dein äußeres IMyInterface nachwievor alles von IMyInterfaceInternal erbt.

Geändert von Windwalker (25. Nov 2010 um 15:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.201 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Interfaces und Properties

  Alt 25. Nov 2010, 15:29
Damit nicht direkt auf die Getter/Setter zugegriffen werden kann und man beim Instanzieren und Verwenden der Objekte gezwungen ist, über die Properties die Felder zu setzen und auszulesen.
Du weißt aber schon das beim Compilieren genau der umgekehrte Fall gemacht wird. Überall wo eine Property gesetzt wird, wird der entsprechende Setter aufgerufen. Entsprechend beim lesen.

Delphi macht es gegenüber Java schöner das man diese Getter/Setter-Methoden verstecken kann damit man weniger Schnittstelleneinträge (Anzahl Methoden+Properties) hat. Aber für Interfaces ist sowas in keiner Programmiersprache AFAIK vorgesehen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Interfaces und Properties

  Alt 25. Nov 2010, 15:35
Damit nicht direkt auf die Getter/Setter zugegriffen werden kann und man beim Instanzieren und Verwenden der Objekte gezwu
Ob man nun das Property nutzt oder direkt auf Getter/Setter zugreift, das macht intern keinerlei Unterschied.

Nur im externen Aufruf, also in der Nutzung sieht es anders aus.
Und da kann es manchmal schöner sein, wenn man einen Setter direkt nutzt.
Aber egal.

Wie gesagt, vom Programmfluß her ist es egal, ob man das Property oder den Getter/Setter nutzt ... man kann mit einer veränderten Sichtbarkeit und für mehr "Komfort" sorgen, oder in eine gewisse Richtung der Nutzung steuern, damit die Aufrufe einheitlicher werden.

Ganz verstecken kannst du keine Interfaceinhalte, denn was einmal sichtbar ist, dab bleibt auch irgendwo sichtbar.


Wenn das IMyInterfaceInternal nicht bei TMyClass aufgelistet ist, dann kann man von TMyClass nicht so einfach auf IMyInterfaceInternal casten und hat somit keinen direkten Zugriff darauf.


PS: Interface = offene Schnittstelle ... da ist, wie schon genannt, keine Versteckmöglichkeit vorhanden.
$2B or not $2B

Geändert von himitsu (25. Nov 2010 um 15:37 Uhr)
  Mit Zitat antworten Zitat
Windwalker

Registriert seit: 9. Mär 2009
72 Beiträge
 
#7

AW: Interfaces und Properties

  Alt 25. Nov 2010, 15:36
Damit nicht direkt auf die Getter/Setter zugegriffen werden kann und man beim Instanzieren und Verwenden der Objekte gezwungen ist, über die Properties die Felder zu setzen und auszulesen.
Du weißt aber schon das beim Compilieren genau der umgekehrte Fall gemacht wird. Überall wo eine Property gesetzt wird, wird der entsprechende Setter aufgerufen. Entsprechend beim lesen.
Selbstverständlich!
Aus diesem Grund gibt es ja in Delphi die Properties, während man in Java/C++ direkt die Getter/Setter verwenden muss.

Natürlich ist es kein Beinbruch und v.a. auch kein Verlust an Funktionlität/Sicherheit, aber mindestens an Lesbarkeit ghet was verloren, wenn man die internen Felder eines Objekte nun sowohl über Property als auch Getter/Setter auslesen kann.
  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 15:17 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