Einige Sprachen und Laufzeit-Frameworks (z. B. Java, .NET) gehen davon aus, dass jedem, der den Code für eine bestimmte Klasse kompiliert, vertraut werden kann, dass er keine privaten Member einer Instanz dieser Klasse auf eine Weise verwendet, die sich nachteilig auf deren Richtigkeit auswirkt Operation. Andere Sprachen und Frameworks sind in dieser Hinsicht restriktiver und erlauben keinen Zugriff auf private Mitglieder einer Instanz, außer durch Code, der auf dieser Instanz ausgeführt wird . Beide Ausführungen haben Vor- und Nachteile.
Der größte Vorteil, den Code innerhalb einer Klasse auf private Mitglieder einer Instanz zugreifen zu lassen, besteht darin, dass es Fälle gibt, in denen diese Zugriffsebene angemessen ist. Wenn Sie auf private
diese Weise arbeiten, ist es nicht mehr erforderlich, entweder ein anderes Zugriffsqualifikationsmerkmal für diesen Zweck verfügbar zu haben oder sonst wird der Code gezwungen, Mitglieder breiter darzustellen, als dies ansonsten ideal wäre.
Ein Vorteil des Nichtzulassens eines solchen Zugriffs (wie dies im Microsoft Common Object Model (COM) der Fall war) besteht darin, dass externer Code Klassen als Schnittstellen behandeln kann. Wenn eine Klasse ImmutableMatrix
ein privates oder geschütztes enthält double[][]
dahinter liegendes Feld, und wenn der Code innerhalb der Klasse den Trägers Reihe von anderen Fällen untersucht, dann wird es nicht möglich sein , eine nicht-Array-backed - Klasse zu definieren (zB ZeroMatrix
, IdentityMatrix
) , die als könnte außerhalb Code verwenden ein Immutable2dMatrix
, ohne dass diese Klasse das Hintergrundfeld mit einbeziehen muss. Wenn nichts in Immutable2dMatrix
verwendet private Mitglieder einer anderen Instanz als this
, dann wäre es möglich, die Klasse umzubenennen ImmutableArrayBackedMatrix
und eine neue abstrakte ImmutableMatrix
Klasse zu definieren, die ImmutableArrayBackedMatrix
als Subtypen auch die oben genannten Klassen ohne Array-Unterstützung haben könnte.
Beachten Sie, dass ein solches Refactoring nicht dadurch verhindert werden würde, dass die Sprache "erlauben" würde ImmutableMatrix
, das Backing-Array auf andere Instanzen als zu untersuchen this
, es sei denn, die Sprache nutzte diese Fähigkeit und untersuchte tatsächlich externe Instanzen. Der primäre Effekt der Einschränkung einer solchen Verwendung durch eine Sprache besteht darin, dass der Compiler bei jedem Versuch, Code zu schreiben, der für ein solches Refactoring nicht zugänglich wäre, sofort quietscht.
equals
dass private Felder einer anderen Instanz überprüft werden müssen. (Posting als Kommentar, da dies kurz ist, und nichts über die OOP-Ness dieses Ansatzes)