2016-07-06 7 views
0

에서 '정적'코드를 분리하기 위해 상속을 사용하는 청소기 방법 현재에 붙어. 코드 흐름을 추적하기 어려워지는 구성 요소 간의 복잡한 상호 작용을 포함하는 응용 프로그램을 작성하고 있습니다. 이를 단순화하기 위해 각 레이어가 위에있는 레이어와 비교하여 기능이 향상 된 '레이어'를 만들어 코드를 구조화하려고합니다. 각 레이어는 패키지에 포함되어 있습니다. 향상된 기능과 함께 다음과 같은 두 클래스와 그 서브 클래스를 고려내가 난 이상한 약간의 문제가</p> <p>(I 코드 변경 취약인지 구별을 의미하는 정적 및 동적으로) '동적'코드

: 나는 다음과 같은 문제에 봉착

클래스 A :

package layer; 
class A { 
    B b; 

    A() { 
     b = new B(); 
    } 

    void foo() { 
     b.foo(); 
    } 

    /* More A-class methods here */ 
} 

클래스 B :

package layer; 
class B { 
    void foo() { 
     // Do something 
    } 

    /* More B-class methods here */ 
} 

서브 클래스 A를 :

package sublayer; 
class ASub extends A { 

    ASub() { 
     super.b = new BSub(); // This needs a cast to compile 
    } 
} 

서브 클래스 B : 난 그냥 인스턴스화 실제로 클래스 A와 B 자체 코드를 수정하지 않고도 상위 클래스 A와 B의 모든 방법을 사용할 수있는 클래스 ASUB 및 BSUB을 수정하려는 결국

package sublayer; 
class BSub extends B { 
    @Override 
    void foo() { 
     // Do something with more functionality 
    } 
} 

. 내가 new ASub().foo()를 호출하면

, 나는 당연히 내가 ASUB에서 변수 BSub bsub를 추가하고 bsub.foo()를 호출하는 A의 foo는() 메소드를 재정의 할 수 있습니다 대신 B.의의 실행 BSUB의 오버라이드 (override) foo는()를 원하지만이 나던 피하기는 객체의 생성은 A의 생성자에 b을 만들었습니다. 이것은 엉성한 코딩으로 보입니다. 이것에 대한 어떤 생각? 모든 의견을 환영합니다.

답변

0

귀하의 질문에 약간의 논란이 있습니다. 객체 생성 및 의존성 주입은 다양한 토의와 다양한 프레임 워크 및 디자인 패턴의 핵심 주제입니다.

이 아닌 질문에 대한 간단한 대답은 여기에 있습니다. 일반적으로 "Java로 개체를 만드는 가장 좋은 방법은 무엇입니까?"

아래 코드에서 BA (수퍼 클래스) 생성자에서 호출되는 메서드 (instantiateB())로 인스턴스화해야합니다. 따라서 A의 하위 클래스를 만들 때 생성자를 재정의하는 대신 해당 메서드를 재정의합니다.

package com.matt.tester; 

public class SE { 

    static class A { 
     B b; 

     A() { 
      instantiateB(); 
     } 

     void instantiateB() { 
      this.b = new B(); 
     } 

     void foo() { 
      b.foo(); 
     } 

     /* More A-class methods here */ 
    } 

    static class B { 
     void foo() { 
      System.out.println("Hellow from B.foo()!"); 
     } 

     /* More B-class methods here */ 
    } 
    static class ASub extends A { 

     @Override 
     void instantiateB() { 
      this.b = new BSub(); 
     } 
    } 
    static class BSub extends B { 
     @Override 
     void foo() { 
      System.out.println("Hellow from BSub.foo()!"); 
     } 
    } 

    public static void main(String[] args) { 
     A a = new ASub(); 
     a.foo(); 
    } 
} 
+0

다른 방법이 없다면이 방법을 시도해 볼 것입니다. 너무 추한 것처럼 보이지는 않지만 해킹과 같은 느낌입니다. 감사합니다! – user2443647

0

재사용을 촉진하기 위해 상속을 사용하는 것은 정말 좋은 생각입니다. 상속은 항상 설명하려고하는 객체의 본질에 의해 주도되어야합니다. 당신은 용어와 추상화를 사용하여 자신에게 "내가 무엇을 기술하려고했는지의 본질이 무엇인지"물어볼 수있는 자신을 배워야합니다. 제 제안은 도메인 주도 디자인 (Domain Driven Design)에 대한 책 또는 코드 완성을 배우는 것입니다. 다형성과 디자인 패턴에 대해서도 생각해보십시오.

+0

나는 당신이 말하는 것을 이해하고 이에 대해 생각합니다. 왜 그렇게 나쁘지는 모르겠지만 내 핵심 문제는 '기본 기능'에서 내 응용 프로그램을 분할하는 방법과 더 자세한 추가 사항을 찾는 것입니다. 어쨌든 귀하의 답변을 주셔서 감사합니다 – user2443647

+0

서비스를 사용하여 도우미 클래스를 사용하여 다른 패턴을 사용하십시오. 재사용 성을 위해서만 상속을하지 말고 집계를 대신 사용하십시오.사물과 캡슐화를 생각하십시오. 아마 당신의 의지를 원한다면 당신은 당신의 가족을 포함시킬 것이고 드물게 당신은 다른 누군가를 포함시킬 것입니다, 프로그래밍과 동일합니다. 우리에게 나쁜 친척이 있다면 우리는 의지에서 그를 무시할 수 있습니다. 마찬가지로 aucward 논리를 가진 하위 클래스에도 적용됩니다. 예를 들어 Map과 MultiMap 대부분의 구현은 Map과 MultiMap에 대해 동일한 인터페이스를 상속하지 않습니다. 두 번째 것은 어색합니다. –