2012-12-01 4 views
7

인터페이스와 그 인터페이스를 구현하는 많은 클래스가 있다고 가정합니다. 각 클래스에 기본 구현 인 toString()을 재정의하려는 경우 (즉, 일부 클래스가 재정의하지 않으면 컴파일 오류가 발생합니다).toString() 메서드가 클래스에서 다시 구현되도록하는 방법은 무엇입니까?

달성 할 수 있습니까? 인터페이스 본문에 @Override 주석이 있거나 없음을 나타내는 public abstract String toString();을 선언하는 것은 유효하지만 효과가 없습니다.

답변

2

주석 처리기 및 주석 처리기를 작성하고 컴파일하는 동안 사용하십시오.

귀하의 주석이 다음과 같이 표시됩니다

public @ interface MustOverrideToString { } 

하고 주석 프로세서가

  1. 는 toString에게
을 무시하지 않는 MustOverrideToString 주석으로 클래스를 확장하는 모든 클래스를 찾습니다
+0

이것은 많은 일처럼 보이지만 근사합니다! – chessofnerd

14

음, 일종의.

protected abstract String internToString(); 

하고 기본 클래스에서 다음

@Override 
public String toString() { 
return internToString(); 
} 

.

+1

영리하지만()'이 처음으로 파생 클래스는'internToString를 구현 한 후 작동이 중지됩니다 것 - 후손을 다시 구현하지 않아도됩니다 : 당신이 다른 하나의 방법이 필요하지 않습니다 엉덩이. –

+0

@VictorSorokin A) Original, B) Child 클래스, C) Granchild 클래스에는 3 가지 가능성이 있습니다. C는'toString()'을 구현하지 않습니다. 이는 toString()을 호출 할 수있게합니다.()', 이는 B의'internToString()'을 호출합니다. C는'toString()'을 오버라이드 (override) 해, 독자적인 구현을 돌려줍니다. C는'toString()'을 오버라이드하고 B의'internToString()'을 호출하는 A를 호출하는 B를 호출하는'super(). toString()'을 호출합니다. 나는 어떤 호출 순서에 대해 오해하지 않는 한, 이것이 목표를 달성했다고 생각한다. – Izkata

+0

당신의 솔루션은 여분의 추상 클래스를 생성하고, 인터페이스를 구현하는 각각의 클래스가 그 추상 클래스를 확장하도록 만드는 것이 맞습니까? – k29

1

특정 클래스에 toString() 메서드를 구현하는 것 외에는 아무 것도 선언 할 필요가 없다고 생각합니다.

+0

질문은 부모 클래스가 새로운 클래스를 강제로 강제로 수행 할 수 있습니까? – Izkata

0

abstract cl을 만드는 경우

public abstract class Base{ 
    public abstract String toString(); 
} 

... 

public class Sub extends Base{} //will not compile 
관련 문제