2011-04-14 9 views
13

나는 모두 동일한 추상 클래스를 확장하는 6 개의 클래스가 있습니다. 추상 클래스에는 클래스의 인스턴스화 당 한 번만로드하려는 일부 JNI 코드를 가리키는 정적 변수가 있습니다.추상 클래스에서 정적 변수 상속

내가 알기로는이 정적 변수의 인스턴스 하나가 인스턴스화된다는 것을 알지만, 각 확장 클래스는 주어진 자식 클래스에 고유 한 변수의 정적 인스턴스를 갖기를 원합니다. 추상 클래스를 수정하거나 추상 클래스를 해제하는 코드를 작성하고 싶습니다. 한 번에이 두 가지를 모두 할 수 있습니까?

예를 들어 변수 foo가있는 추상 클래스 막대와 foo의 내용을 인쇄하는 printFoo 메소드를 작성할 수 있습니다. 그렇다면 fooBar1, fooBar2 및 fooBar3 순서로 인스턴스화합니다. 각각은 bar 클래스를 확장하고 foo를 정적 블록의 다른 값으로 초기화합니다. foobar1.printFoo을 호출하면 foo의 정적 값을 fooBar1 생성자로 초기화하여 출력하고 싶습니다.

java로 수행 할 수 있습니까?

+0

제 1 단락에서 브래킷을 닫으면 저를 미치게됩니다! – HXCaine

+0

'일부 코드를 가리키는 정적 변수'. 좀 더 설명해 주시겠습니까? Java 코드를 어떻게 가리 킵니까? – mdma

+0

OpenCL GPU 코드 주위에 JNI 래퍼 인 jocl을 사용하고 있습니다. GPU에게 무엇을해야하는지 알려면 실행될 코드를 가리키는 CL_program을 만들어야합니다.이 코드는 GPU가 사용할 컴파일 된 커널을 나타내는 cl_kernel을 생성합니다. 프로그램 및 커널 변수는 GPU 코드의 JIT 컴파일을 수행하는 데 너무 오래 걸리기 때문에 정적 변수로 사용됩니다. 하지만 다른 것들 중에서 코드를 해제하는 데 사용할 수있는 추상 클래스를 원한다. – drew

답변

6

근사치를 지정할 수 있지만 각 하위 값을 덮어 쓰지 않으려면 하위 클래스마다 별도의 정적 변수가 필요합니다. getter getFoo을 통해 이것을 추상화하는 것이 가장 쉽습니다. 그래서 각 서브 클래스는 foo를 올바른 위치에서 가져옵니다. 이

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

같은

뭔가 내가 비슷한 문제가 있습니다. Java가 정적 멤버 (특성)를 격리 할 수없는 것처럼 보입니다. 애트리뷰트 대신 추상적 인 메서드를 추가했습니다.

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(); 

    } 
}