2017-01-30 7 views
2

수퍼 클래스 BaseClass와 하위 클래스 SubClass가 있고 하위 클래스의 기능 중 일부를 약간 다르게 지정하려면 원본을 재정의하고 수퍼를 호출하고 약간의 추가 기능을 추가하는 것은 좋지 않은가요?super를 호출하여 약간의 기능을 추가하기 위해서만 함수를 재정의하는 것은 나쁜 습관입니까?

예를 들면 : (의사 코드)

public class BaseClass{ 
    int fooA(); 
    int fooB(); 
    int fooC(); 
} 

public class SubClass extends BaseClass{ 
    @Override 
    int fooB(){ 
     int temp = super.fooB(); 
     temp += 1; 
     return temp; 
    } 

    @Override 
    int fooC(){ 
     System.out.println("I'm doing something extra in fooC!"); 
     return super.fooC(); 
    } 
} 

내가 코드 중복을 방지하기 위해 노력하고있어,하지만 난 종류의 느낌이 나는 뭔가 잘못하고 또는 몇 가지 기본적인 OOP 물건을 잊어 버리는 것 같은, 그래서 내가 생각 이것이 나쁜 행동인지 물어 봅니다. 상속을 한 지 오래되었습니다. 어떤 통찰력에도 감사드립니다. 대신 다음을 수행 할 수 있습니다 상속의

+1

상속을 통해 구성을 선호합니다. – Kayaman

+1

@ 카야 만 (Kayaman) "상속에 대한 구성을 선호합니다"라는 말은 항상 사실과 같습니다. 경우에 따라 상속보다 컴포지션이 적합하고 다른 경우에는 상속이 컴포지션보다 적합합니다. –

+1

* 상속을 한 지 얼마되지 않았습니다. :) – CKing

답변

2

:

public class SubClass implements MyInterface { 
    private MyInterfaceBasicImpl base; 

    int fooB(){ 
     int temp = base.fooB(); 
     temp += 1; 
     return temp; 
    } 

    int fooC(){ 
     System.out.println("I'm doing something using in fooC in base object!"); 
     return base.fooC(); 
    } 
} 

그것은 Composition 패턴의 쉬운 예입니다. Java에는 다중 상속이 없으므로 개선을 위해 코드를 열어 놓을 것입니다.

+0

SubClass가 기본 클래스와 비슷한 (또는 같은) 생성자를 갖기를 원한다면, 내가 상속 받아야 할 것입니다. 맞습니까? (나는 원래의 질문에 그것을 넣지 않았다는 것을 알고 있지만,주의 사항이 나왔음을 알기 때문에).내가 올바르게 기억한다면 추상 클래스와 인터페이스의 콤보를 찾아야합니다. 다시 주셔서 감사합니다. – GuitarStrum

+0

새 생성자에서 참조를 유지할 개체를 생성 할 수 있습니다. – xenteros

1

방법을 오버라이드 (override)하는 서브 클래스의 능력은 그의 행동이다 "충분히 가까이"다음 에 필요한 동작을 수정하는 슈퍼 클래스에서 상속하는 클래스를 할 수 있습니다. 재정의 메서드는 매개 변수의 수 및 형식과 동일한 이름을 가지며 메서드를 재정의하는 반환 형식을가집니다. 재정의 메서드는 재정의 된 메서드에서 반환 한 유형의 하위 유형을 반환 할 수도 있습니다. 이 부속 유형은 공 변 형 리턴 유형이라고합니다.

이 질문에 대한 답변을 제공해주십시오. 당신은 당신이 제안 무엇을 할 수

https://docs.oracle.com/javase/tutorial/java/IandI/override.html

0

는 옵션입니다. 그러나 같은 것을하는 예를 들어 3 개의 클래스가 있다면 어떻게됩니까? 당신은 여전히 ​​코드와 로직을 반복하고 있습니다. 왜냐하면 각각의 코드에서 super라고 부르기 때문입니다. 이 경우 템플릿 메서드 패턴을 구현할 수 있습니다. 그것에 대해 읽지 않았다면, 수퍼 클래스의 메소드를 추상으로 정의하고 거기서 사용하고 서브 클래스에서 정의하는 것을 의미합니다. 귀하의 예에 따라,이 같은 것을 볼 수 있었다 :

public class BaseClass{ 
    int fooA(); 
    int fooB(); 
    int fooC(){ 
    //here goes the common logic; 
    this.printWhatItHasToPrint(); 
    } 
    void printWhatItHasToPrint() {}; //if the class is abstract you may define it as abstract 
} 

public class SubClass1 extends BaseClass{ 
    @Override 
    int fooB(){ 
     int temp = super.fooB(); 
     temp += 1; 
     return temp; 
    } 

    @Override 
    void printWhatItHasToPrint(){ 
     System.out.println("I'm doing something extra in fooC!"); 
    } 
} 

public class SubClass2 extends BaseClass{ 

    @Override 
    void printWhatItHasToPrint(){ 
     System.out.println("I'm doing something extra in fooC, and I'm another class!"); 
    } 
} 
0

을 나는 그것이 올바른 접근 방법이 될 수 있습니다 생각하지만, 내 경험에서 구현 일반적인 기능으로 하나 개의 추상 클래스를 만든 다음 두 개의 서브 클래스가 더 읽기 쉽고 편리 그런 식으로, 서로 다른 기능을 구현하기 위해 그것을 확장 : 큰 프로젝트를 탐색하는 것이 훨씬 쉬울과 느낌 것

public abstract class BaseClass { 
    public void fooA() { 
     System.out.println("Some common function"); 
    } 

    public void fooB() { 
     System.out.println("Another common function"); 
    } 

    public abstract int fooC(); 
} 

public class SubClass1 extends BaseClass { 
    @Override 
    public int fooC() { 
     return 0; 
    } 
} 

public class SubClass1 extends BaseClass { 
    @Override 
    public int fooC() { 
     return 1; 
    } 
} 

이 방법은 자연