Frage

hatte, ich habe eine Klasse Oberklasse und zwei Unterklassen SubClassA und SubClassB dass vererben geordneten Klasse.

 abstract class SuperClass{
   ...
   List someList;
   ...
 }

 class SubClassA extends SuperClass{
   ...
   List<String> someList;
   ...
 }

 class SubClassB extends SuperClass{
   ...
   List<Integer> someList;
   ...
 }

Auf diese Weise ist es praktisch, weil ich someList.size() in Superclass bekommen können und Typsicherheit in den Subklassen. Das Problem ist, dass es nicht „Gefühl“ richtig, können Sie über mögliche Gefahren denken, das apporach hat, dass ich bin mir nicht bewusst?

War es hilfreich?

Lösung

Für eine Sache, jede Methode der SuperClass sieht die übergeordnete Klasse Liste, nicht die der Unterklasse. Diese fast sicher führt zu subtiler Bugs. Z.B. wenn Sie sagen,

  

Ich kann erhalten someList.size() in Superclass

, was Sie tatsächlich bekommen, ist die Größe der Liste in Superclass, nicht die der Unterklasse. Die übergeordnete Klasse Liste leer sein kann, während die Unterklasse Liste enthält Elemente (oder umgekehrt).

Der Grund dahinter ist, dass SubClassA.someList in keiner Weise ersetzen oder überschreiben Superclass.someList nicht - es es nur Schatten, so dass die Unterklasse Methoden SubClassA.someList sehen statt Superclass.someList. Dies hat jedoch keinerlei Auswirkungen in Superclass. Methoden gemacht virtuelle (und in Java, sind sie standardmäßig aktiviert), aber Datenelemente nicht.

Andere Tipps

Dies ist eine wirklich schlechte Idee. Haben Sie wirklich Möchten Sie eine Instanz von jeder Unterklasse haben, zwei Listen? Denn das ist, was geschieht. Sie sind eine zweite Variable erklärt wird - so Code in der übergeordneten Klasse eine Variable verwenden, und den Code in der Unterklasse wird eine andere verwenden. Das ist nur Ärger bringen, IMO.

Ich denke, man sollte eher eine Methode anstelle der Klassenvariable definieren. Damit Sie Methoden in Unterklassen in der Lage zu implementieren und nicht zu Sorgen über die Typsicherheit benötigen.

Ersetzen Variable mit Methode schlage ich vor.

Dank.

Es scheint zu brechen IS-A und das Liskov Substitutionsprinzip zu mir. Wenn Sie eine Sammlung von super Instanzen, von denen jede SubClassA oder SubClassB sein können, werden Sie einige überraschende Verhalten am besten erhalten.

Tun Sie es nicht.

Vielleicht Generika etwas mit besser wäre:

public class X<T>
{
    private List<T> list;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top