2016-07-11 1 views
0

나는 추상 클래스 (Abs)에서 상속 한 여러 클래스 (Sub1, Sub2, Sub3)를 가지고 있습니다. 모든 하위 클래스에는 정적 속성과 같은 모든 인스턴스에 대해 동일한 여러 속성 (size, delay 등)이 있습니다. 코드의 중복을 피하고 한 곳에서만 초기화하기 위해 이러한 모든 하위 클래스 속성 (및 접근 자)을 다시 그룹화하고 싶습니다. 가능한가? 이 솔루션으로여러 클래스의 정적 속성을 한 곳에서 초기화 (Java)

Sub1 sub1 = new Sub1(); 

int size = Sub1.getSize(); // size == 1000 

Sub1.setSize(500); 
Sub2.setSize(700); 

size = sub1.getSize(); // size == 500 
size = Sub1.getSize(); // size == 500 
size = Sub2.getSize(); // size == 700 

:

public abstract class Abs { 
    protected static final int DEFALUT_SIZE = 1000; 
    protected static final int DEFALUT_DELAY = 1000; 
} 

class Sub1 extends Abs { 
    private static int size; 
    private static int delay; 

    public Sub1() { 
     size = DEFALUT_SIZE; 
     delay = DEFALUT_DELAY; 
    } 

    public void setSize(int size) { this.size = size; } 
    public int getSize() { return size; } 
    public void setDelay(int delay) { this.delay = delay; } 
    public int getDelay() { return delay; } 
} 

class Sub2 extends Abs { 
    private static int size; 
    private static int delay; 

    public Sub1() { 
     size = DEFALUT_SIZE; 
     delay = DEFALUT_DELAY; 
    } 

    public void setSize(int size) { this.size = size; } 
    public int getSize() { return size; } 
    public void setDelay(int delay) { this.delay = delay; } 
    public int getDelay() { return delay; } 
} 

class Sub3 extends Abs { 
    /* Same code here */ 
} 

내가 다음을 수행 싶습니다 :

는 여기에 내가 원하는 동작을 얻을하도록 강요하고 무엇을 보여 코드의 샘플입니다 각 하위 클래스에서 동일한 코드를 모두 다시 작성해야합니다.

는 내가 정적 속성이 추상 클래스에서 그렇게하기 때문에 불가능 상속되지 않은 것을 알게

...

+2

아마도 설명 할 코드를 게시 할 수 있습니다. –

+0

구체적인 사례가 무엇인지 잘 모르겠지만 부모 클래스 Ab에 모든 정적 변수 및 메소드를 배치 할 수 있습니다. 정적 메서드를 재정의한다는 의미입니까? 그렇다면 Java에서는 불가능합니다. –

+0

사용할 수있는 옵션은 실제로 클래스를 사용하는 방법에 따라 다릅니다. –

답변

1

그것은 상수를 제외한 모든 경우에, 그 가정하는 것은 일반적으로 좋은 생각이다, 키워드 static는 악 모든 비용을 들이지 않고 피해야합니다.

static 키워드를 크기 및 지연 앞에서 제거하고 보호하도록 설정 한 다음 초기화 코드와 함께 추상 Abs 클래스로 이동하여 초기 값과 접근 자 및 변경자 (getter 및 setters)를 설정합니다. , 당신은 선언들과 초기화를 서브 클래스들에서 제거 할 수있을 것이다.

코드는 다음과 같이 보일 것이다 : 복근 클래스는 이러한 속성을해야합니다 확장

다음
public abstract class Abs { 
private static final int DEFALUT_SIZE = 1000; 
private static final int DEFALUT_DELAY = 1000; 

private int size = DEFAULT_SIZE; 
private int delay = DEFAULT_DELAY; 

public void setSize(int size) { this.size = size; } 
public int getSize() { return size; } 
public void setDelay(int delay) { this.delay = delay; } 
public int getDelay() { return delay; } 
} 

아무것도.

개체간에 이러한 속성을 공유하려면 약간 다른 작업을해야하지만 많은 옵션이 있습니다. 작성시 각 인스턴스에 주입되는 공유 값을 보유하는 공통 클래스를 가질 수 있거나 일종의 이벤트/관찰자 패턴을 사용할 수 있습니다. 그러나, 이것은 처음부터 아주 이상한 일입니다. 일반적으로 우리는이 정보를 나타내는 일종의 중앙 객체를 가지고 필요할 때마다 전달합니다. 일반적으로 이것을 구현하기 위해 하위 클래스에 setter 및 getter가 없을 것입니다. 가지고있는 것은 글로벌 자산을 관리하는 서비스와 비슷합니다.

+0

예, 예를 들어 Sub1 인스턴스의'size' 속성을 변경하면 다른 모든 Sub1 인스턴스는 이전 값을 유지합니다. –

+0

예. 함께 변경하려면 완전히 다른 구조가 필요합니다. 반영 할 답변을 업데이트하겠습니다. –