geschützte Daten in der abstrakten Klasse
Meine Frage betrifft speziell Java, abstrakte Klassen und die Verwendung geschützter Daten. Ich bin seiend sagte, dass alle Daten sollten private und protected Getter/setter verwendet nur.
Nun, ich verstehe, wir wollen die Schild-Daten aus der direkten manipulation von Gelegenheits-Benutzer der Klasse, und, dass die öffentlichen Daten der Mitglieder im Allgemeinen für eine fragwürdige Praxis. Ich sah Sie an "Java-geschützte Felder vs public Getter" ( Java-geschützte Felder vs public Getter ), aber ich bin immer noch bedenklich, dass:
protected int i;
ist schlimmer in einer abstrakten Klasse als:
private int i;
protected int geti();
protected void seti(int j);
Ich bin einfach nicht sehen, die Seite nach unten, wenn die abstrakte Klasse gibt es genau geben Eltern/gemeinsame Einrichtung, um die Kinder Klassen, und der geschützte Bereich ist gedacht, um Zugang zu den Kindern, während der Schutz der Daten von Gelegenheits-Benutzer. I Hinweis in der Frage oben verwiesen wird, dass die meisten Antworten scheinen, die Frage zu klären, warum Daten in der Regel privat statt öffentlich. Ich versuche mich zu konzentrieren meine Frage speziell auf die vorhandenen Daten in einer abstrakten, übergeordneten vorgesehen für den Gebrauch durch die Kinder. Der einzige vernünftige Kommentar, den ich gehört habe bisher ist, dass mit den Eltern zu geschützten Daten (z.B. int i oben) Blättern Sie mit code in der Kind-Klasse, die auf eine variable nicht deklariert, in die Kind-Klasse. Weniger überzeugend ist das argument (siehe Gemeinsame geschützten Daten-member in der Basisklasse? ), die Sie möglicherweise ändern möchten, die Zugriff auf einige Tage, und jetzt haben Sie zu Ehren Ihrer Schnittstelle. Dies ist eine abstrakte Klasse, und soll erweitert werden, 100% der Zeit.
Dank! Spezifische Titel/Seite# Verweise auf Bücher sind weit mehr hilfreich ist, dass Verweise auf " ... alle grundlegenden Java-Programmierung text..."
========================================== 10-13-2010
Dies war, wie vieles, eine Frage zu abstrakten Klassen, als es sich um geschützte Daten. Ich finde es enttäuschend, dass der Fokus scheint sich verlagert zu haben, in den Antworten, ob Daten versteckt, ist eine gute Sache in OOP (Antwort: ja). Es gibt eine Menge von Tiefe, die hier mit der Natur der abstrakten Klasse, und wie unterscheidet es sich von einem normalen nicht-Finale Klasse, und welche möglichen Vorteile könnte es für die Festsetzung der Namen und Typen von Daten-Elemente, die in der abstrakten Eltern-für die Nutzung durch das Kind-Klassen. Ich denke, dass hier die Möglichkeit besteht, für innovation und eine bessere Kontrolle erweitert, unten, von der abstrakten Eltern-zu der Umsetzung der Kind-Klassen. Ich bin besorgt darüber, dass die Allgemeinen Grundsätze, wie Sie die Vorteile des data-hiding, kann dogma geworden, und hemmen die innovation und die Entwicklung von neuen mustern und Ideen.
Danke an alle, die dazu beigetragen haben.
InformationsquelleAutor der Frage cvsdave | 2010-08-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn das Feld privat ist und der Zugriff über Getter und setter sind, werden Sie in der Lage, implementieren Sie Getter und setter (zum Beispiel, durch die das Feld und aktualisieren/Lesen den Wert aus einer externen Quelle), und damit ändern, wie das "Feld" arbeiten, ohne zu berühren keine Kind-Klassen.
Ob sich das lohnt, das ist bis zu Ihnen.
InformationsquelleAutor der Antwort alex
Denke, der geschützte Methoden als Schnittstelle für die Unterklassen, die in der gleichen Weise, dass die öffentlichen Methoden stellen die Schnittstelle für alle anderen.
Bereitstellung von Zugriffsmethoden ermöglicht der base-Klasse, um seinen Zustand: es gibt keine Möglichkeit, eine Unterklasse wäre es zu verderben, ohne eine absichtliche trick.
InformationsquelleAutor der Antwort KeatsPeeks
Haben weniger Zugang ist kein Nachteil, es ist ein Vorteil. Klassen sollten immer beschränken Sie Zugang zu so viel von Ihrem inneren Zustand, wie möglich. Denke nicht, warum Interna sollte ausgeblendet werden, anstatt zu denken, warum sollte Sie ausgesetzt werden. In diesem Fall wie in jedem Fall, es sei denn, es gibt einen wirklich guten Grund zu setzen die variable dann setzt es nicht.
InformationsquelleAutor der Antwort Skip Head
Wenn Sie nicht brauchen, Ihr Kind zu direkt zugreifen, warum sollten Sie es zulassen ?
Es ist nicht eine Seite nach unten zu verwenden, geschützt sind. Aber wenn es nicht notwendig ist, ist es vielleicht besser, es zu vermeiden und den Zugriff auf Ihre Felder.
InformationsquelleAutor der Antwort Colin Hebert
In Java protected-Elemente sind zugänglich für alle Mitglieder im gleichen Paket zusätzlich zu jeder Verlängerung der Klassen. Machen Sie das Feld privat wird verhindern, dass Klassen im selben Paket von der direkt auf es zu.
Als auch es ist der Punkt, dass alex hob früher.
InformationsquelleAutor der Antwort Rontologist
Wenn jemand Unterklassen Ihrer Klasse, und stellt die Unterklasse im selben Paket wie die aktuelle Klasse haben, können Sie überschreiben möchten Ihre Getter und setter. Zum Beispiel, Sie möchten, stellen Sie sicher, dass
i
kann nur eingestellt werden auf einen Wert größer als 1.Andere als das, es ist wirklich bis zu Ihnen. Die Konvention ist, dass es Getter und setter für alles obwohl.
InformationsquelleAutor der Antwort Serplat
Information hiding ist wertvoll, auch unter den Klassen, die im Zusammenhang von Vererbung.
Darüber hinaus ermöglicht re-Implementierung, wie bereits von alex erwähnt:
InformationsquelleAutor der Antwort Andy Thomas
Den Sie verwenden möchten Getter/setter, da mit
protected int i;
ermöglicht Feld überschreiben (die Sie wollen unter allen Umständen zu vermeiden).Wollen Sie verbieten Feld überschreiben, weil es anders funktioniert als Methode überschreiben. Feld überschreiben nicht die überschriebene Feld nicht zugegriffen werden (der Typ der Referenz entscheidet, auf welche Instanz des Feldes, mit der Sie arbeiten).
Zugänglichen Felder sollten endgültig sein, oder in eine Klasse, die final ist.
Auf den ersten Blick sieht dies wie etwas, das würde nur den code schwer zu Lesen, aber es hat Auswirkungen auf die Funktionalität. Sagen Sie das Feld nicht überschrieben wird durch eine abgeleitete Klasse, da die Set-Methoden werden nicht eingesetzt, es gibt keine Möglichkeit, automatisch Updates der Basis-Feld und keine Möglichkeit, zu erkennen, wenn sich jemand geändert hat, die Basis-Bereich (da der Basis-Wert ist immer noch zugänglich), und aktualisieren Sie das Feld abgeleitet. Es ist leicht vorstellbar, dass die Basis-und abgeleitete Staaten könnten aus dem Takt geraten und dass die Fehler, die hart sein würde, auf die Spur. Einfach ausgedrückt macht es für eine sehr spröde API.
Leider gibt es keine Möglichkeit zum Schutz gegen diese, da die
final
Schlüsselwort, das schützt vor überschreiben, macht auch Felder schreiben, einmal. Also keine beschreibbaren nicht-overloadable Felder.Ich persönlich bin eher überrascht, die Sprache, die Designern erlaubt, Feld überschreiben überhaupt. Der Vorteil der Verwendung von Settern ist, dass jede Ebene kann über die Garantie der Integrität des eigenen Staates und das Vertrauen, dass abgeleitete Klassen haben nicht gefoult es. Feld überschreiben ist nur ärger bringen.
InformationsquelleAutor der Antwort BlindWanderer