2017-11-15 4 views
1

이 코드에서 봐 상속 클래스의 필드를 포함OOP 디자인 : 클래스의 상속 클래스를 다른 클래스

public static class A { 

    public void doA() { 

    } 

} 

public static class B extends A { 

    public void doB() { 

    } 

} 

public static class AE { 
    protected A field; 

    public AE(A field) { 
     this.field = field; 
    } 

    public void doStuff() { 
     field.doA(); 
    } 

} 

public static class BE extends AE { 

    // wanna have B field; 

    public BE(B field) { 
     super(field); 
    } 

    public void doAnotherStuff() { 
     field.doA(); 
     field.doB(); // error here 
    } 

} 

같은 디자인 문제에 대한 최선의 해결책은 무엇인가? 나는 두 가지 옵션을 참조하십시오 1)) DOB()

((B) field).doB(); 

이 전화 BE 클래스 FO 다른 필드로 B를 저장하고 생년월일을 필요로 할 때 (이 필드를 호출 할 필요가있을 때 B 형 필드 매번 캐스팅) 기능 :

protected B field2; 

    public BE(B field) { 
     super(field); 
     field2 = field; 
    } 

두 가지 해결책은 모두 분명하고 좋지 않습니다. 경우 1) 런타임 캐스팅에서 성능이 손실되고 캐스팅 필드가 매번 오류처럼 보입니다. 경우 2) 정확히 동일한 객체 B에 대한 포인터를 포함하는 BE 클래스의 두 필드가 있으며 유형 (필드는 클래스 A의 필드와 클래스 B의 필드 2)에서만 다릅니다. 이 문제에 대한 더 나은 해결책이 있습니까?

+0

제네릭을 사용할 수 있습니다. – Neilos

답변

2

당신은 제네릭 사용할 수 있습니다

public static class AE { 
    private A field; 

    public AE(A field) { 
     this.field = field; 
    } 
    public void doStuff() { 
     field.doA(); 
    } 

    protected A getField() { 
     return field; 
    } 
} 

public static class BE extends AE { 

    public BE(B field) { 
     super(field); 
    } 

    @Override 
    protected B getField() { 
     return (B) super.getField(); 
    } 

    public void doAnotherStuff() { 
     getField().doA(); 
     getField().doB(); // no error here 
    } 

} 

보호 게터를 추가 및 하위 클래스를 오버라이드 (override) : @Eran 당신이 제네릭을 사용하거나 대신 같은 것을 할 수있는 제안으로

public static class AE<T extends A> { 
    protected T field; 

    public AE(T field) { 
     this.field = field; 
    } 

    public void doStuff() { 
     field.doA(); 
    } 

} 

public static class BE extends AE<B> { 

    // wanna have B field; 

    public BE(B field) { 
     super(field); 
    } 

    public void doAnotherStuff() { 
     field.doA(); 
     field.doB(); 
    } 

} 
+0

고마워요! 필요한 것! 이제는 내 자신이 알아 내지 못했던 바보 같은 느낌이 들었습니다 ... – Crabonog

0

을 . 이렇게하면 유형을 한 번만 캐스팅해야합니다.

+0

이것은 컴파일 타임이 아닌 런타임시 유형 검사를 제외하고는 기본적으로 제네릭의 대답과 동일한 코드입니다. 왜 귀찮아? – millimoose