2012-01-06 2 views
2

나는 클래스 ParentClass(), 일부 자식 클래스 ChildClass1(), ChildClass2() 등 및 인터페이스 iChild()을 가지고 있습니다. ChildClass()ParentClass()에서 상속 및 구현 iChild() 다음 iChild() - 인터페이스에서인터페이스 : 추상 상수가 필요합니까?

class ChildClass1 
    extends ParentClass 
    implements iChild {} 

class ChildClass2 
    extends ParentClass 
    implements iChild {} 

, 나는 몇 가지 상수 (주로 식별자와 일부 기능이 정의되는) 작성해야 할 것을 요구하고 싶습니다. 상수는 인터페이스에만 정의 될 수 있지만 구현 클래스에서는 재정의 할 수 없으므로 어떤 의미도 찾지 못했습니다. 내가 찾은 유일한 해결책은 iChild()에 몇 개의 getter-functions을 정의하는 것으로, 필요한 값을 반환하지만 올바른 방법은 아닙니다. 이미 ParentClass()에서 연장되었으므로 예를 들어 추상 클래스를 사용할 수 없습니다. 모든 ChildClasses에서 필수 상수의 정의를 확인하십시오.

이 문제를 해결하는 방법에 대한 아이디어가 있으십니까?


업데이트 :이 코멘트에 대답하려면 - 날씬하고 내 말은 더 읽기와 다음에 :

class ChildClass1 { 
    const MY_NAME = "Foo Bar Name 1"; 
} 

-- vs -- 

class ChildClass1 { 
    public function GetMyName() { 
     return "Foo Bar Name 1"; 
    } 
} 

내가 더 많이 읽고 두 번째보다 더 이해할 수있는 첫 번째 예제를 찾을 수 있습니다. 유감스럽게도 현재 ChildClasses에서 MY_NAME을 설정하도록하는 방법이 없습니다.

답변

3

여기서 적절한 해결책은 상수에 대한 것이 확실하지 않습니다. 상수의 바로 정의는 변화가 없다는 것입니다. iChild의 각 구현에서 상수를 정의해야하는 경우 실제로 상수가 아니며 변수입니다. 적절한 getter 메서드를 추가하여 사용자에게 구현시이 정보를 제공해야한다고 제안하는 것이 좋습니다.


좋아, 나는 약간의 테스트를했고, 클래스가이 구현되는 인터페이스하거나 확장하고 부모 클래스에 의해 일정한 세트를 대체하는 것은 단순히 수 없습니다. 컴파일시 클래스 상수가 검사 된 것처럼 보이고 재정의하려고하면 치명적인 오류가 발생합니다. 적절한 대답을하려는 것은 인터페이스에 getter 메서드를 제공하는 것입니다.

+0

그게 내가 현재 구현 된 방법이지만, 오히려 메서드보다는 상수를 호출하고 싶습니다. 그것은 더 희박하고 "더 정확한 느낌"입니다. 귀하의 답변을 주셔서 감사합니다. – Lars

+1

그것은 어떻게 더 가늘고 "더 정확한 느낌"입니까? 어쨌든 서로 다른 구현체가 구현 클래스 이름에 묶이지 않고 다른 상수를 정의하게 만들지는 않을 것입니다. – cspray

관련 문제