Tengo 3 clases, MainClass con el método main de una clase abstracta llamada AbstractClass y Subclase que se ampliará con AbstractClass.

El array de objetos que se creó en el principal método de tipo AbstractClass contiene 1 miembro.
A continuación, inicializo que 1 elemento de la matriz como el tipo de Subclase( es correcto?).
El problema es que no puedo ir a la getDataToExport() método de objeto creado ( array[0] ) .
Sospecho que el problema se produce porque la matriz es el AbstractClass tipo de…
Y la pregunta es: ¿es esto posible lograr?
Lo que estoy tratando de hacer es usar una matriz de tipo AbstractClass y llenar con objetos de diferentes subclases( en este código es sólo uno->Subclase ) extendido con AbstractClass pero no puedo llegar a los métodos de las subclases.

principal de la clase con el método main

public class MainClass {

    public static void main() {

        AbstractClass array[]=new AbstractClass[1];
        array[0]= new Subclass(); //is this even allowed?
        System.out.println(array[0].getDataToExport()); //Problem!

    }

}

clase abstracta

public abstract class AbstractClass {

}

Subclase que se extiende AbstractClass

public class Subclass extends AbstractClass {

    private int dataToExport;

    public Subclass(){
        this.dataToExport=2;
    }

    public int getDataToExport() {
        return dataToExport;
    }   

}
InformationsquelleAutor Luka | 2010-11-09

5 Comentarios

  1. 5
    AbstractClass array[]=new AbstractClass[1]; 
    matriz[0]= new Subclase(); //esto es incluso permite?

    Sí, está bien, pero no significa que, cuando posteriormente se vaya a utilizarlo, sólo tiene acceso a lo que está definido en AbstractClass (restricción de uso de un yeso, pero desea evitar el uso de moldes donde se puede, y no hay necesidad de uno aquí).

    La única razón real para hacer las entradas de matriz de tipo AbstractClass sería si sólo desea interactuar con los miembros definidos en esa clase. Así, por ejemplo, en este caso, quizás quieras tener el getDataToExport define como un método abstracto en la clase abstracta:

    public abstract class AbstractClass {
        public abstract int getDataToExport();
    }

    Usted también podría considerar la opción de tener un interfaz en lugar de una clase abstracta. Dado que una clase sólo puede derivar de una clase base, pero pueden implementar interfaces tantas como se quiera, a menos que haya un gran cuerpo de común aplicación que te gustaría poner en la clase base abstracta, es mejor que con una interfaz — porque no poner a las restricciones innecesarias en las implementaciones de la interfaz. De hecho, está casi siempre mejor con una interfaz; siempre puede también tener una base abstracta si quieres.

    Así, por ejemplo:

    public class MainClass {
    
        public static void main() {
    
            NiftyThingy array[]=new NiftyThingy[1];
            array[0]= new NiftyThingyImplementation();
            System.out.println(array[0].getDataToExport());
    
        }
    
    }

    donde

    public interface NiftyThingy {
    
        public int getDataToExport();
    
    }

    y

    public class NiftyThingyImplementation implements NiftyThingy {
    
        public int getDataToExport() {
            return /* ... the data ... */;
        }
    
    }
    • Gracias, esto realmente me ayudó mucho
    • Genial, me alegro de que la ayudó. Si usted siente que respondieron a la pregunta, haga clic en el vacío de la marca de verificación a la izquierda del comienzo de la respuesta, de modo que usted marca su pregunta «, respondió.» (Si no creo que esto responde a la pregunta, no hagas eso. 🙂 )
  2. 0

    Usted no será capaz de conseguir debido a que se está declarando un array de AbstractClass con el fin de que usted tiene dos opciones

    • Declarar los métodos comunes que se utilizan en la clase abstracta y declarar abstracto. Reemplazar los métodos de las subclases. Por ejemplo:

      clase abstracta pública AbstractClass {
      public abstract int getDataToExport();
      }

    Y cada subclase tendrá que reemplazar este método o debe ser declarada abstracta demasiado.

    • Crear una matriz de Sublclass:

      Subclase de array[] = new Sublcass[1];
      matriz[0] = new Subclase();
      Sistema.a cabo.println(matriz[0].getDataToExport());

  3. 0

    Sí, todo esto está perfectamente bien. El único paso que te ha faltado es que usted necesita para elenco la instancia del objeto con el tipo que tiene el método que desee. La forma habitual de hacer esto es:

    AbstractClass ac = array[0];
    if (ac instanceof Subclass) {
      System.out.println(((Subclass)ac).getDataToExport()); //No problem!
    }

    Sin embargo, usted puede ser que desee pensar acerca de hacer esto de otra manera. Por ejemplo, implementar una versión predeterminada de getDataToExport en el resumen de la clase que devuelve null. De esa manera usted no tiene que hacer el yeso o instanceof prueba.

  4. 0
      AbstractClass array[]=new AbstractClass[1];
      array[0]= new Subclass(); //is this even allowed?

    De hecho, es válido como SubClass es una clase derivada de AbstractClass. La razón por la que

    System.out.println(array[0].getDataToExport());

    falla es porque el compilador no puede encontrar AbstractClass.getDataToExport() método. Es sólo SubClass que tiene el método y no de su padre.

    Hay un par de maneras de resolver esto:

    Agregar un método abstracto getDataToExport a la AbstractClass así:

    public abstract class AbstractClass {
        public abstract int getDataToExport();
    }

    O, Encasillado la variable a sus derivados (concreto) que tiene la clase getDataToExport() método, así:

    if (array[0] instanceof SubClass) {
        System.out.println(((SubClass)array[0]).getDataToExport());
    }

    la instanceof operador simplemente indica que el atributo de una clase X (donde X es SubClass).

Dejar respuesta

Please enter your comment!
Please enter your name here