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.
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:
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.
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.
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.
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.
Tags und Links programming-languages oop