2008-10-25 8 views
20

추상 클래스가 인스턴스 변수를 정의하도록하는 것이 좋습니까?Java - 변수를 포함하는 추상 클래스?

public abstract class ExternalScript extends Script { 

    String source; 

    public abstract void setSource(String file); 

    public abstract String getSource(); 
} 

서브 클래스, ExternalJavaScript.class, 자동으로 소스 변수를 얻을 수 있지만 모든 하위 클래스 자체는 소스를 정의하는 경우가 대신 상속에서 코드를 읽기 쉽게 느낄 것입니다.

귀하의 조언은 무엇입니까?

/아담

답변

29

변수를 추가하는 것이므로 훨씬 더 좋을 것이라고 생각 했겠지만, 왜 액세스를 제한하고 더 깨끗하게 만들지 않습니까? 귀하의 getter/setter는 그들이 주석에 대해 말하는 것을해야합니다.

public abstract class ExternalScript extends Script { 

private String source; 

public void setSource(String file) { 
    source = file; 
} 

public String getSource() { 
    return source; 
} 

질문이 다시 현실로, 당신은 이제까지 그것을 읽을 때 게터/세터 코드는 어디에서 찾고 귀찮게합니까? 그들이 모두 얻고 설정한다면 코드를 읽을 때 함수가 무엇을하는지 걱정할 필요가 없습니다. 소스가 (서브 클래스에 의해 그렇게 접근) 보호 된

  • 경우 코드가 지저분 : 변수를 변화하고 너무 생각하는 몇 가지 다른 이유가있다? 객체 일 때 리팩터링 할 필요가있을 때 어려워집니다. 반면에 메소드가이 단계를 더 쉽게 만드는 경향이 있습니다.
  • getter/setter 메소드가 가져오고 설정하지 않으면 다른 것으로 설명하십시오.

언제나 수업이 정말로 다른 것인지 아닌지를 생각하면 더 필요한 것이 있는지 여부를 결정하는 데 도움이됩니다.

6

물론 .. 왜?
요약 기본 클래스는 저장 및 유지 관리의 효율성을 위해 한 곳에서 2 개 이상의 클래스에 공통된 동작 및 데이터를 저장하는 데 편리합니다. 그것의 구현 세부 사항.
그러나 인터페이스를 사용해야하는 추상 기본 클래스를 사용하고 있지 않도록주의하십시오. Interface vs Base class

1

물론. 추상 클래스의 전체 개념은 모든 하위 클래스가 포함해야하는 동작이나 데이터를 포함 할 수 있다는 것입니다. WheeledVehicle의 간단한 예제를 생각해보십시오 - numWheels 멤버 변수가 있어야합니다. 모든 하위 클래스에이 변수가 있어야합니다. 추상 클래스는 API를 개발할 때 매우 유용한 기능이므로 API를 확장 한 사람들이 API를 중단시키지 않도록 할 수 있습니다.