Warum haben OOP-Sprachen keinen 'read only' Zugriffsmodifikator?

7

Jedes Mal, wenn ich triviale Getter schreibe (Funktionen holen, die nur den Wert des Members zurückgeben), frage ich mich, warum Sprachen nicht einfach einen schreibgeschützten Zugriffsmodifikator haben, der es erlaubt, den Wert der Mitglieder des Objekts zu lesen aber erlaubt es nicht, sie genau wie const Dinge in C ++ zu setzen.

Mit den privaten, geschützten Modifizierern für öffentliche Zugriffsrechte erhalten Sie entweder vollen (Lese- / Schreib-) Zugriff oder keinen Zugriff.

Ein Getter zu schreiben und jedes Mal aufzurufen, ist langsam, weil das Funktionsaufrufen langsamer ist als nur auf ein Mitglied zuzugreifen. Ein guter Optimierer kann diese Getter-Aufrufe optimieren, aber das ist "Magie". Und ich denke nicht, dass es eine gute Idee ist zu lernen, wie ein Optimierer eines bestimmten Compilers funktioniert und Code zu schreiben, um es zu nutzen.

Warum müssen wir in der Praxis also Accessoren schreiben, nur Schnittstellen lesen, wenn nur ein neuer Zugriffsmodifikator das tun würde?

ps1: Bitte sag nichts wie 'Es würde die Kapselung kaputt machen'. Ein öffentliches foo.getX() und ein öffentliches, aber nur lesbares foo.x würden dasselbe tun.

EDIT: Ich habe meinen Post nicht klar geschrieben. Es tut uns leid. Ich meine, Sie können den Wert des Mitglieds außerhalb lesen, aber Sie können es nicht einstellen. Sie können den Wert nur innerhalb des Klassenbereichs festlegen.

    
Calmarius 17.07.2010, 11:04
quelle

9 Antworten

11

Sie verallgemeinern falsch von einer oder mehreren OOP-Sprache (n), die Sie kennen, in OOP-Sprachen im Allgemeinen. Einige Beispiele für Sprachen, die schreibgeschützte Attribute implementieren:

  • C # (Danke, Darin und Tonio)
  • Delphi (= Objekt Pascal)
  • Ruby
  • Scala
  • Ziel-C (Danke, Rano)
  • ... mehr?

Ich persönlich ärgere mich, dass Java das (noch?) nicht hat. Wenn man das Feature in anderen Sprachen gesehen hat, erscheint das Schreiben von Texten in Java ermüdend.

    
Carl Smotricz 17.07.2010, 11:11
quelle
9

Nun einige OOP-Sprachen haben einen solchen Modifikator.

>     
Darin Dimitrov 17.07.2010 11:06
quelle
5

In C # können Sie eine automatische Eigenschaft mit verschiedenen Zugriffsqualifikationsmerkmalen für die Gruppe definieren und erhalten:

%Vor%

Auf diese Weise kann die Klassenimplementierung nach Herzenslust an der Eigenschaft basteln, während Client-Code sie nur lesen kann.

    
Marcelo Cantos 17.07.2010 11:12
quelle
2

C # hat readonly , Java und einige andere haben final . Sie können diese verwenden, um Ihre Membervariablen schreibgeschützt zu machen.

In C # können Sie einfach einen Getter für Ihre Eigenschaft angeben, so dass er nur gelesen, nicht geändert werden kann.

%Vor%     
BoltClock 17.07.2010 11:08
quelle
2

Eigentlich sind sie nicht gleich. Public foo.getX() würde weiterhin zulassen, dass der interne Klassencode in die Variable schreibt. Ein schreibgeschütztes foo.x wäre auch für den internen Klassencode schreibgeschützt.

Und es gibt einige Sprachen, die solche Modifikatoren haben.

    
Franci Penov 17.07.2010 11:08
quelle
0

C # -Eigenschaften ermöglichen das einfache Definieren von schreibgeschützten Eigenschaften. Sehen Sie sich diesen Artikel an.

    
tonio 17.07.2010 11:06
quelle
0

Ganz zu schweigen von Objective-C 2.0 property read-only accessors Ссылка

    
rano 17.07.2010 11:20
quelle
0

In Delphi:

%Vor%

Deklariert eine schreibgeschützte Eigenschaft, die auf das private Feld FAnswer zugreift.

    
gabr 17.07.2010 12:51
quelle
0

Die Frage läuft weitgehend auf: Warum hat nicht jede Sprache eine konstante Eigenschaft wie C ++?

Deshalb ist es nicht in C #:

  

Anders Hejlsberg: Ja. In Gedenken an   const, es ist interessant, weil wir   höre diese Beschwerde die ganze Zeit auch:   "Warum hast du nicht const?" Implizit   in der Frage ist: "Warum tust du nicht?   haben const das wird durch die erzwungen   Laufzeit? "Das ist wirklich was Leute   fragen, obwohl sie nicht kommen   und sag es so.

     

Der Grund, dass const in C ++ funktioniert, ist   weil du es wegwerfen kannst. Wenn du   konnte es nicht wegwerfen, dann deine Welt   würde lutschen. Wenn Sie eine Methode deklarieren   Das braucht einen konstanten Bla, du könntest gehen   es ist ein nicht-konformer Bla. Aber wenn es das ist   andersherum kann man nicht. Wenn du   Deklarieren Sie eine Methode, die a akzeptiert   nicht-const Bla, du kannst es nicht passieren a   Const Bla. Jetzt bist du festgefahren. Also du   brauche allmählich eine const-Version von   alles was nicht const ist und du   am Ende mit einer Schattenwelt. In C ++ du   damit wegkommen, weil wie mit   alles in C ++ ist rein optional   ob Sie diese Überprüfung möchten oder nicht.   Sie können die Konstanz einfach wegjagen   wenn du es nicht magst.

Siehe: Ссылка

Der Grund, warum wy const in C ++ funktioniert, ist, weil Sie es umgehen können. Das ist sinnvoll für C ++, das seine Wurzeln in C hat.

Für verwaltete Sprachen wie Java und C # würden Benutzer erwarten, dass const genau so sicher wäre wie beispielsweise der Garbage Collector. Das bedeutet auch, dass Sie nicht umgehen können, und es wird nicht nützlich sein, wenn Sie nicht umgehen können.

    
user180326 17.07.2010 13:14
quelle

Tags und Links