인터페이스가 있습니다 (추상 클래스 일 수도 있음). 구현자가 특정 기능을 지원하는지 여부를 지정할 수 있어야하며 가장 좋은 방법을 찾고 있습니다. 그것을 달성하십시오.계약에서 기능이 지원되는지 여부를 지정하는 방법
몇 가지 선택이 여기에 있습니다 :
BCL 보면 내가 할 경우, 나는 Stream
클래스가 기능이 지원되는지 확인하는 데 사용할 수 있습니다 CanRead
및 CanSeek
같은 속성을 가지고 있으며, NotSupportedException
던졌습니다 참조 지원되지 않는 것. 내가 또는 지원되지 않을 수있는 몇 가지 기능보다는 이상을 가지고 있고 각 하나에 대한 "SupportsX"속성을 정의하지 않으려는하지만
public interface IHandler { bool SupportsA { get; } bool SupportsB { get; } void A(); void B(); }
이
은 나를 위해 적절한 방법이 될 것입니다.는 또한 비트 Enum
값을 매우 좋아 그리고 난 또 다른 방법이 될 것이라고 생각한다
[Flags]
public enum HandlerFeature
{
None = 0
A = 1,
B = 2,
C = 4
}
public interface IHandler
{
HandlerFeature Features { get; }
void A();
void B();
void C();
}
그리고이 같은 확장 방법을 쓸 수있다 :
bool Supports<T>(this T handler, HandlerFeature feature) where T : IHandler
내가 생각하는 어떤 다른 접근법보다 훨씬 더 낫지 만, 도울 수는 없지만 모든 Enum
값이 계약의 구성원과 일치 할 경우 해당 멤버를보다 명확하게 표시 할 수 있어야한다고 생각합니다. 그럼 난 속성에 대해 생각 : 나는 런타임에서이 같은 속성을 활용하는 방법을 알고하지 않지만
public interface IHandler
{
[HandlerRequires(Feature.None)]
HandlerFeature Features { get; }
[HandlerRequires(Feature.A)]
void A();
[HandlerRequires(Feature.B)]
void B();
[HandlerRequires(Feature.A | Feature.B)]
void AB();
[HandlerRequires(Feature.C)]
void C();
}
, 그것은 확실히 인터페이스 정의가 충분히 명시 적 보이는 있습니다.
모범 사례가 있습니까?
아니면 다른 방법을 권하고 싶습니까?
내가 지정한 것과 관련된 문제가 있습니까?
http://en.wikipedia.org/wiki/Interface_segregation_principle – Ani