Frage

In OOP-Sprachen wie C # oder VB.NET, wenn ich die Eigenschaften oder Methoden in einer Superklasse protected machen kann ich sie nicht in meiner Form zugreifen - sie können nur in meiner Klasse zugegriffen werden, die von dieser Superklasse erbt.

Um diese Eigenschaften oder Methoden zugreifen Ich brauche sie public zu machen, die Verkapselung besiegt oder neu schreiben sie in meine Klasse, die Erbschaft besiegt.

Was ist der richtige Weg, dies zu tun?

War es hilfreich?

Lösung

„brauchen, um sie öffentlich zu machen, die besiegt Kapselung“

Sie conflate nicht gutes Design mit den ekligen Sichtbarkeitsregeln. Die Sichtbarkeitsregeln sind verwirrend. Es gibt wirklich zwei orthogonale Arten von Sichtbarkeit - Unterklasse und Client. Es ist nicht ganz klar, warum wir überhaupt etwas von unserer Unterklasse verbergen würden. Aber wir können mit private.

Hier ist, was wichtig ist. Encapsulation bedeutet nicht versteckt. Geschützte und privat ist kein wesentlicher Bestandteil guter Kapselung. Sie können ein gutes Design tun mit allem, was öffentlich sein (das ist die Art, wie Python funktioniert, zum Beispiel).

Die geschützten / privaten Sachen sind - vor allem - über Intellectual Property Management: sind bereit, Sie (in einem gesetzlich zu verpflichten, verbindlich, "see-you-in-court-wenn-es-spielte keine Arbeit" Art und Weise ) an eine Schnittstelle? Wenn Ihre Software-Entwicklung Anwälte beinhaltet, dann kümmern sich um Sie das Hinzufügen schützen und privat zu dem, was ich ist nicht verpflichtet.

Wenn Sie müssen nicht mit Anwälten bewältigen, sollten Verkapselung Recht zu tun, aber alles öffentlich verlassen.

Andere Tipps

Wenn Sie Code haben, der eine Klasse stellen muss, um eine bestimmte Operation durchführen, aber die Klasse, jedoch ist der Code nicht mit einem Mittel zu tun, dann ist die Klasse nicht Sie Codes Anforderungen erfüllen.

Das bisschen wie wenn man sagt ich ein Auto (Automobil) haben, die eine geschützte Lenkrad hat, damit ich nicht darauf zugreifen können. Das Auto ist nichts für mich.

Entweder die Mitglieder öffentlich machen (oder zumindest intern) und nutzen sie, oder die Klasse Graben und eine, die Ihre raubend Code gibt die Features, die es braucht.

Vielleicht, was Sie wirklich suchen ist eine Schnittstelle. Die Schnittstelle enthält die Mitglieder der Code Bedürfnisse und Sie diese Schnittstelle auf Ihrer Klasse implementieren. Der Vorteil hierbei ist, dass Sie Ihre Klasse feststellen kann, dass die Mitglieder über diese Schnittstelle zugegriffen werden und nicht als Unterklasse erbt.

Es tut uns Leid, es ist nicht klar, was du mit „in meiner Form“ bedeuten - was ist die Beziehung zwischen Form und Ihre zwei Klassen? Wenn Ihre Klassen Kontrollen im selben Projekt sind, und möchten Sie Eigenschaften für den Zugriff aus dem Formular, sollten Sie das ‚interne‘ Schlüsselwort verwenden.

Es gibt mindestens drei Möglichkeiten, wie Sie beschränken können, die einige bestimmte Instanz Methode von bestimmten Klasseninstanzen verwenden kann:

  1. Definieren Sie die Methode als `protected`,` internal` oder `private`. Im ersten Fall wird eine Instanzmethode nur benutzbar sein aus abgeleiteten Klassenmethoden der gleichen Instanz; im zweiten Fall werden alle Klassen in der Baugruppe wird der Zugang zu diesen Methoden haben, aber Klassen außerhalb wird nicht; im dritten Fall, keine äußeren Klassen, selbst abgeleitet diejenigen in derselben Baugruppe, Zugang haben, es sei denn, ihren Code innerhalb der deklarierte Klasse verschachtelt ist.
  2. Definieren Sie die Methode als `public`, aber die Klassen, die Instanzen erstellen, halten sie privat und nie an die Außenwelt aus. Wer auf eine Instanz Methode für ein Objekt aufzurufen, hat eine Instanz, um es aufzurufen, auf. Wenn eine Klasse Instanzen hält aber macht nie direkte Verweise auf sich, die nur Instanzmethoden, die jemals auf diesen Fällen verwendet werden können, werden diejenigen, die die Halteklassen gebildet werden selbst sein.
  3. Definieren Sie die Methode als `public`, aber einen Konstruktor hat, die einen Ort akzeptiert, in denen ein oder mehr Teilnehmer an privaten Methoden gespeichert werden können. Code mit Zugang zu den Delegierten in der Lage, die Methoden, um dadurch bezeichnet zu nennen, aber auch anderer Code wird nicht (außer durch Reflexion in einer Weise verwendet, die ich denke, nur verwendbar sind, in voller Vertrauen Szenarien).

Wenn Reflexion in nicht-voll vertrauenswürdigen Szenarien würde ungebunden Delegierten erlaubt, beliebige Objektinstanzen gebunden zu sein, könnte man verschachtelte Klassen verwenden, um # zu verstärken 3, so dass eine private Feld zugreifen müßten illegitimen Zugang zu den private Funktionen zu gewinnen ; das wäre auf jeden Fall außerhalb voll vertrauenswürdige Szenarien verboten werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top