2011-04-14 21 views
13

Tengo media docena de clases que extienden la misma clase abstracta. La clase abstracta tiene una variable estática que apunta a un código JNI que solo quiero cargar una vez por instanciación de las clases.Heredar variable estática de la clase abstracta

Por lo que entiendo, esto da como resultado exactamente una instancia de esta variable estática instanciada, pero lo que quiero es que cada una de las clases tengan su propia instancia estática de la variable que es única para la clase secundaria dada. Quiero escribir un código en mi clase abstracta que modifique y/o libere la clase abstracta. ¿Es posible hacer ambas cosas a la vez?

Así, por ejemplo, puedo escribir una barra de clase abstracta con una variable foo y un método printFoo que imprime el contenido de foo. Luego instanciamos en orden fooBar1, fooBar2 y fooBar3, cada uno de los cuales extiende la clase de barra e inicializa foo a diferentes valores en bloques estáticos. Si llamo al foobar1.printFoo, quiero imprimir el valor estático de foo inicializado por el constructor fooBar1.

¿Se puede hacer esto en Java?

+0

Por favor, cierre el corchete en su primer párrafo, ¡eso me vuelve loco! – HXCaine

+0

una 'variable estática que apunta a algún código'. ¿Puedes explicar eso un poco más? ¿Cómo señalas el código en Java? – mdma

+0

Estoy usando jocl, que es un contenedor JNI alrededor del código GPU de OpenCL. Para decirle a la GPU qué hacer, uno tiene que crear un programa CL que apunte al código que se ejecutará y a partir de ese generar un cl_kernel que represente el kernel compilado que utilizará la GPU. El programa y las variables del núcleo son los que tengo como estáticos porque lleva demasiado tiempo hacer la compilación justo a tiempo del código de la GPU. Pero quiero, entre otras cosas, un método de publicación de la clase abstracta que se puede usar para lanzar el código. – drew

Respuesta

6

Puede aproximarlo, pero necesitará variables estáticas separadas para cada subclase, para evitar que las subclases sobrescriban los valores de los demás. Es más fácil abstraer esto a través de un getter getFoo para que cada subclase recupere el foo del lugar correcto.

Algo como esto

abstract class Bar 
{ 
    // you don't have to have this in the base class 
    // - you could leave out the variable and make 
    // getFoo() abstract. 
    static private String foo; 

    String getFoo() { 
    return foo; 
    } 

    public void printFoo() { 
     System.out.print(getFoo()); 
    } 
} 

class Foo1 extends Bar 
{ 
    static final String foo1; 

    public String getFoo() { 
     return foo1; // return our foo1 value 
    } 

    public Foo1() { 
     foo1 = "myfoo1"; 
    } 
} 


class Foo2 extends Foo1 
{ 
    static final String foo2; 

    public String getFoo() { 
     return foo2; // return our foo2 value 
    } 

    public Foo2() { 
     foo2 = "myfoo2"; 
    } 
} 
1

Tengo un problema similar. Parece que Java no puede aislar miembros estáticos (atributos). Terminé agregando un método abstracto en lugar del atributo:

public abstract class Abs { 
    public void printX() { 
     System.out.println("For " + this.getClass() + " x=" + getX()); 
    } 

    protected abstract Integer getX(); 

} 

public class A extends Abs { 
    protected static Integer x = 1; 

    @Override 
    protected Integer getX() { 
     return x; 
    } 

} 

public class B extends Abs { 
    protected static Integer x = 2; 

    @Override 
    protected Integer getX() { 
     return x; 
    } 

} 

public class test { 

    public static void main(String args[]) { 
     Abs a = new A(); 
     a.printX(); 
     Abs b = new B(); 
     b.printX(); 
     Abs c = new A(); 
     a.printX(); 
     b.printX(); 
     c.printX(); 

    } 
} 
Cuestiones relacionadas