2010-04-23 3 views
2

나는 속성을 연주하고 상속된다고 가정하지만, 그렇게하지 않는 것 : 그것은 클래스 1에서 상속 있지만속성 상속하지 않습니까?

type 
    [MyAttribute] 
    TClass1 = class 
    end; 

    TClass2 = class(TClass1) 
    end; 

TClass2는 속성 "MyAttribute"을 가지고 있지 않습니다. 속성을 상속 가능하게 만들 가능성이 있습니까? 아니면 클래스 계층 구조로 올라가서 속성을 검색해야합니까?

답변

3

속성은 클래스 나 다른 심볼 (예 : 메소드)의 데코레이션입니다. 속성은 선언을 장식하지만 클래스의 기능은 아닙니다. 결과적으로 속성은 상속되지 않습니다.

예. 클래스 계층 구조로 올라가 속성을 찾을 수도 있지만 더 나은 해결책이 있습니다. 빈 인터페이스 (IMyInterface = Interface)를 "마커"인터페이스로 사용하십시오. 인터페이스 구현 클래스의 모든 자손도 해당 인터페이스의 구현 자입니다. 기본 클래스가 TInterfacedObject 또는 TComponent를 기반으로하는 경우 이미 기본 클래스가 IInterface를 구현한다는 것을 보장하기 만하면됩니다.

이 작업을 완료하면 지원 기능을 사용하여 클래스 또는 그 조상 중 하나가 인터페이스를 구현하는지 테스트 할 수 있습니다.

0

저는 델파이에서 속성을 사용하지 않았습니다. 그래서이 답변은 일종의 추측입니다. 하지만 기본적으로 자바와 동일한 주석을 알고 있습니다.

하지만 상속되지 않는다면 이해할 수 있습니다. 하위 클래스는 다른 속성을 필요로하거나 수퍼 클래스의 속성과 모순됩니다. 또한 속성이 상속되지 않으면 "your"속성 용도로 사용해야하는 경우 계층 구조를 따라갈 수 있습니다. 그들이 상속 되었다면 어떤 속성이 슈퍼 클래스가 아닌 특정 클래스에 있는지 여부를 감지하는 것이 어려울 것입니다.

상속이 필요하고 수퍼 클래스를보고 싶지 않은 경우 클래스 함수 나 클래스 속성 또는 태그 인터페이스 (메서드가 선언되지 않음)를 사용하는 것이 좋습니다. 그것들은 상속됩니다.

+0

저는 폼 상속을 사용하고 이러한 폼의 단위 테스트를 제어하는 ​​특성을 가지고 있습니다. 모든 하위 클래스/폼이 자동으로 테스트되기를 원했습니다 ... 이제이 특성이 있는지 클래스 계층 구조를 위쪽으로 반복합니다. –

+1

클래스 함수가 ​​더 나은 솔루션입니다. –

관련 문제