각기 다른 유형의 상속 클래스마다 정적 변수의 다른 사본을 가질 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1448092

문제

클래스 유형에 따라 값이 다른 동일한 정적 변수를 원합니다.

그래서 나는 가질 것이다

public class Entity
{
     public static Bitmap sprite;

     public void draw(Canvas canvas, int x, int y)
     {
          canvas.drawBitmap(sprite, x, y, null);
     }
}

public class Marine extends Entity
{

}

public class Genestealer extends Entity
{

}

그리고 내 주요 프로그램에서 이동 :

Marine.sprite = // Load sprite for all instances of Marine
Genestealer.sprite = // Load sprite for all instances of Genestealer

수업의 모든 인스턴스에 동일한 스프라이트를 저장하고 싶지 않습니다. 각 유형의 수업마다 하나를 원합니다. 정적 스프라이트 변수와 스프라이트를 끌어 올리는 드로우 함수를 상속하고 싶습니다. 그러나 나는 Genstealer Sprite가 해양 스프라이트를 무시하는 것을 원하지 않습니다.

이게 가능해?

어떻게할까요?

도움이 되었습니까?

해결책

추상 방법을 사용하십시오 :

public class Entity
{
     public abstract Bitmap getSprite();

     public void draw(Canvas canvas, int x, int y)
     {
          canvas.drawBitmap(getSprite(), x, y, null);
     }
}

public class Marine extends Entity
{
    public Bitmap getSprite() {
        return /*the sprite*/;
    }
}

GetSprite가 반환 한 스프라이트는 원하는 경우 정적이 될 수 있습니다. 이 접근법에 대한 좋은 점 :

  • 초록 메소드를 구현하지 않으면 컴파일러가 불만을 제기하기 때문에 서브 클래스에 스프라이트를 포함하는 것을 쉽게 잊을 수 없습니다.

  • 유연합니다. 해병대가 "레벨 업"되면 다르게 보인다고 가정합니다. 해양의 getsprite 방법을 변경하여 레벨을 고려하십시오.

  • 이런 종류의 일에 대한 표준 oo-idiom이므로 코드를보고있는 사람들은 머리를 긁지 않습니다.

다른 팁

슈퍼 클래스에서는 정적이 될 수 없습니다. 슈퍼 클래스의 정적 변수는 모든 하위 클래스에서 공유됩니다 (효과적으로 싱글 톤). 당신이 그것을 변경할 때마다 (예 : 서브 클래스를 인스턴스화함으로써) 그 변경은 다른 모든 서브 클래스 인스턴스에 반영됩니다.

대신, 스프라이트를 서브 클래스에서 정적으로 만들고 Laurence가 설명한 방법 구조를 사용하십시오.

나는 같은 질문이 있었고 정적 매핑을 사용하기 위해 해결책을 찾았습니다.

클래스 -> 개체.

다음 코드 예제는 정수를 원하는 "class-static"변수의 유형으로 사용합니다.

import java.util.Map;
import java.util.HashMap;

class C
{
    static Map<Class<?>,  Integer> class2IntegerMap = new HashMap<Class<?>, Integer>();


    public void setClassSpecificInteger(Integer _i)
    {
        class2IntegerMap.put(this.getClass(), _i);
    }

    public Integer getClassSpecificInteger()
    {
        return class2IntegerMap.get(this.getClass());    
    }           
}

class CA extends C
{
}

class CB extends C
{
}

class CAA extends CA
{
}

public class MainClass
{
    public static void main(String []args)
    {
        CA a1 = new CA();
        CA a2 = new CA();
        CB b1 = new CB();
        CB b2 = new CB();
        CAA aa1 = new CAA();

        a1.setClassSpecificInteger(Integer.valueOf(-1));
        b1.setClassSpecificInteger(Integer.valueOf(+33));

        System.out.println("The int-value for a1 is: "+a1.getClassSpecificInteger());
        System.out.println("The int-value for b1 is: "+b1.getClassSpecificInteger());

        System.out.println("The int-value for aa1 is: "+aa1.getClassSpecificInteger());

        System.out.println("The int-value for a2 is: "+a2.getClassSpecificInteger());
        System.out.println("The int-value for b2 is: "+b2.getClassSpecificInteger());

        CA a3 = new CA();
        CB b3 = new CB();

        System.out.println("The int-value for a3 is: "+a3.getClassSpecificInteger());
        System.out.println("The int-value for b3 is: "+b3.getClassSpecificInteger());

        CAA aa2 = new CAA();

        aa2.setClassSpecificInteger(Integer.valueOf(8));

        System.out.println("The int-value for aa1 now is: "+aa1.getClassSpecificInteger());
    } 
} 

출력은 다음과 같습니다.

The int-value for a1 is: -1
The int-value for b1 is: 33
The int-value for aa1 is: null
The int-value for a2 is: -1
The int-value for b2 is: 33
The int-value for a3 is: -1
The int-value for b3 is: 33
The int-value for aa1 now is: 8

나는 이것이 누군가를 돕기를 바랍니다. 제발 친절하십시오.

따라서 하나의 스프라이트를 만들고 모든 사람에게 인스턴스 변수를 제공하십시오. 그들은 단지 언급 일뿐입니다. 포인터보다는 거의 없습니다.

빠른 테스트는 예, 서브 클래스로 정적 변수를 무시할 수 있음을 보여줍니다.

나는 이것을 테스트하기 위해 간단한 상속 구조를 모았습니다. Statictest는 statictestsub의 슈퍼입니다. 그들은 둘 다 정적 INT를 선언합니다 TEST1, TEST2, 그리고 TEST3 다양한 액세스 정도가 있습니다. 예제를 단순화하기 위해 private 버전.

public class StaticTest {
    public static int TEST1 = 1;
    protected static int TEST2 = 1;
    static int TEST3 = 1;

    public static void main(String[] args) {
            System.out.println("StaticTest.TEST1: " + StaticTest.TEST1);
            System.out.println("StaticTest.TEST2: " + StaticTest.TEST2);
            System.out.println("StaticTest.TEST3: " + StaticTest.TEST3);
            System.out.println("StaticTestSub.TEST1: " + StaticTestSub.TEST1);
            System.out.println("StaticTestSub.TEST2: " + StaticTestSub.TEST2);
            System.out.println("StaticTestSub.TEST3: " + StaticTestSub.TEST3);
    }
}


public class StaticTestSub extends StaticTest {
    public static int TEST1 = 2;
    protected static int TEST2 = 2;
    static int TEST3 = 2;
}

집에서 시도해 볼 수 있습니다. 출력은 다음과 같습니다.

Statictest.Test1 : 1
Statictest.Test2 : 1
statictest.test3 : 1
StatictestSub.test1 : 2
statictestsub.test2 : 2
StatictestSub.test3 : 2

그러나 특정 요구에 대해서는 Laurence Gonsalves가 취한 접근법을 권장합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top