2015-01-12 5 views
3

나는 추상적 인 Font 클래스를 만들고 있는데, 하위 클래스가 하나의 int 매개 변수 (글꼴 크기)를 사용하는 생성자를 선언하도록하고 싶습니다. 나는 다음과 같이 그렇게 노력했다. 추상 생성자가 허용되지 않는 이유는 무엇입니까?

public abstract class Font { 
    ... 
    public abstract Font(int size); 
    ... 
} 

하지만 내 컴파일러가 선언

Error:(20, 19) java: <path omitted>/Font.java:20: modifier abstract not allowed here 

이 정확히 세상의 끝이 아니다 - 이것은 그냥 구현하기 위해 기억 저를 강제로 자바 컴파일러를 원, 꼭 필요한 것은 그 생성자. 나는 이것이 왜 허용되지 않는지 궁금하다.

+1

이 기능은 좋은 생각이 아닌 것 같아. 어떤 유용한 값으로 초기화되어야하는 다른 private 필드'f'를 정의하는 구체적인 클래스가 있다고 가정하십시오. 그래서 모든 구체적인 클래스 생성자는'f'에 저장할 값을 가져야합니다. 당신의 생성자 중 어떤 것도'(int size)'프로파일을 가지고 있지 않기 때문에 정말로 컴파일러가 불평 할까? – ajb

+1

생성자를 재정의 할 수 없습니다 (항상 콘크리트 유형에 대해 가상이 아닙니다). 왜이 기능이 존재하지 않는지에 관해서 - 잘, 만약 그렇다면 그것은 다른 언어가 될 것입니다. – user2864740

답변

6

생성하는 모든 생성자는이 추상 클래스를 구현하는 모든 클래스에서 호출해야하므로 실제적으로 해당 생성자를 구현하도록 상기시켜야 할 필요는 없습니다.

클래스를 확장하는 사람들이 자체 생성자를 만들 수있는 데에는 많은 이유가 있습니다.

public MySpecialSize16Font() 
{ 
    super(16); 
} 

또는

public ColoredFont(int size, Color color) 
{ 
    super(size); 
    this.color = color; 
} 

는 이러한 클래스 및 제공 할 수 있습니다 생성자을 지정하는 당신의 장소가 정말 아니다 예를 들면 다음과 같습니다.

+0

제 경우에는'Font' 클래스에 대한 생성자가 이미 있습니다 만, 둘 다 구현해야합니다. – anthropomorphic

+2

@ 인 형체 : 개방형/폐쇄 형 원칙을 위반합니다. 자식 클래스가 부모에게 인스턴스화해야하는 모든 것을 제공 할 수 있다면 특정 생성자가 구현되었는지 여부에 대해 왜주의해야합니까? 그들은 그들이 원하는 생성자를 만들 수 있어야합니다. – StriplingWarrior

+0

충분히 공정하게, 나는 당신의 요지를 보았습니다. 나는 그때 내 자신의 컨벤션을 추적해야 할 것입니다. – anthropomorphic

0

적어도 추상 클래스에서는 (오류 검사가없는) 추상 클래스에서 해당 생성자를 구현하고 보호 된 액세스 권한을 부여하고 size 변수를 통해서만 설정 가능하도록하면 해당 생성자를 효과적으로 적용 할 수 있습니다 size이 중요한 속성이라고 가정 할 때 하위 클래스별로 사용하십시오.

0

이 체크 아웃해야합니다 생성자 @ 추상을 제거하는 Can an abstract class have a constructor?

시도합니다. 이 있어야한다 :

public Font(int size); 

는 작동합니다 메신저 착각하지 않을 경우 :

+0

그것은 효과가 있으며, 단지 내가 원하는 것을하지 않습니다. – anthropomorphic

+0

아니요, 작동하지 않으며 오인 된 것입니다. 세미콜론으로 생성자를 남겨 둘 수는 없으므로 구현해야합니다. 이것은 컴파일되지 않습니다. – bcsb1001

+0

@ bcsb1001 오, 네가 맞아, 나는 충분히 자세히 보지 않았다. LOLWTF, 네, 당신이 잘못 본 것처럼 보입니다. – anthropomorphic

관련 문제