Pregunta

decir que tenía una clase SuperClass y dos subclases SubClassA y SubClassB que heredan de superclase.

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

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

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

De este modo, es conveniente, ya que puedo conseguir someList.size() en Superclass y tienen Typesafety en las subclases. El problema es que no se "siente" bien, puede usted pensar en los peligros potenciales de este apporach tiene que no soy consciente de?

¿Fue útil?

Solución

Por un lado, cualquier método de SuperClass ve la lista superclase, no la de la subclase. Esto es casi seguro que conduce a errores sutiles. P.ej. cuando se dice

  

puedo conseguir someList.size() en Superclass

lo que ofrece es el tamaño de la lista de Superclass, no la de la subclase. La lista superclase puede estar vacío mientras que la lista subclase contiene elementos (o viceversa).

La razón detrás de esto es que SubClassA.someList no sustituye en ningún caso o Superclass.someList anulación - sólo sombras que, por lo que los métodos de la subclase ver SubClassA.someList en lugar de Superclass.someList. Sin embargo, esto no tiene absolutamente ningún efecto en Superclass. Los métodos pueden ser hechas virtual (y en Java, que son por defecto), pero los miembros de datos no puede.

Otros consejos

Esta es una muy mala idea. ¿Usted realmente ¿Quieres una instancia de cualquiera de subclase tiene dos listas? Porque eso es lo que está sucediendo. Usted está declarando una segunda variable - lo que el código en la superclase utilizará una variable, y el código en la subclase utilizará otra. Eso es sólo buscar problemas, la OMI.

creo que deberías más bien definir un método en lugar de la variable miembro de la clase. De modo que usted será capaz de aplicar los métodos en sus subclases y no necesita preocuparse por la seguridad de tipos.

Reemplazar variables con el método que sugieren.

gracias.

parece romper IS-A y el principio de sustitución de liskov a mí. Si usted tiene una colección de instancias de la superclase, cada uno de los cuales puede ser SubClassA o SubClassB, podrás conseguir un poco sorprendente comportamiento en el mejor.

No lo haga.

Tal vez algo usando genéricos sería mejor:

public class X<T>
{
    private List<T> list;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top