2011-05-16 5 views
1

는 다음과 같은 인터페이스를 고려하십시오 :열거 형을 인터페이스 ID와 같은 것으로 바꾸는 방법은 무엇입니까?

interface IFile 
{ 
    // Members 
}; 

interface IAudioFile : IFile 
{ 
    // Members 
}; 

interface IVideoFile : IFile 
{ 
    // Members 
}; 

enum ContentType 
{ 
    Audio, 
    Video 
}; 

interface IProvider 
{ 
    HashSet<ContentType> GetSupportedTypes(); 
    IList<IFile> GetFiles(ContentType contentType); 
}; 

나는 ContentType이 열거 중복이라고 생각합니다. 열거 형 대신 인터페이스 식별자와 같은 것을 사용할 수 있습니까?

인터페이스 디자인에 대한 의견은 매우 높이 평가됩니다.

+2

같은 몇 가지 오버로드를 만들 수 있을까? –

+0

@Abdul, 인터페이스 유형이 열거 형 값에 매핑되기 때문에 : IAudioFile => ContentType.Audio; IVideoFile => ContentType.Video –

답변

3

정말 당신이 달성하려고하는지에 따라 다르지만 IProvider만큼 그렇게되도록 내가 하나의 옵션은 당신이 제네릭을 사용하고보고 할 수 있도록

과 같이 구현 될 수있다

interface IProvider 
{ 
    IList<IFile> GetFiles<T>() where T: IFile; 
} 

public void ProviderConcrete() 
{ 
    public IList<IFile> GetFiles<T>() 
    { 
     if(typeof(t) == typeof(IAudioFile)) 
      .... get Audio files 

    } 
} 

및 보통 그렇게

public void Caller() 
{ 
    var files = GetFiles<IAudioFile>(); 
} 
+0

좋습니다. 그러나 지원되는 파일 형식에 대한 정보를 얻는 방법은 무엇입니까 (GetSupportedTypes 참조)? –

+0

흠, 어떤 시나리오에서 GetSupportedTypes를 호출해야합니까? –

+0

클라이언트는 지원되는 유형 집합을 가져 와서 지원되는 형식 만 하나씩 가져올 수 있어야합니다. –

0

처럼라고, 그것은 같은 것을 쓰는 것이 좋습니다 이 :

void method(IFile file) { 
    file.DoYourThing(); 
} 

시간이 지남에 따라 스위치 보통은 유지 보수 악몽이되고, 너무 오류가 발생하기 쉬운 때문이다

void method(ContentType id) { 
    switch (id) { 
    case ContentType.Audio: 
     file.DoThis(); 
     break; 

    case ContentType.Video: 
     file.DoThat(); 
     break; 
    } 
} 

보다.

switches 또는 if-else 체인이 필요할 때 기존의 클래스 계층 구조에 메서드를 삽입하거나 새 클래스를 만드는 것이 좋습니다. 첫 번째 코드 스 니펫에서 볼 수있는 코드를 작성하도록 노력해야합니다.

평소와 같이 이것은 일반적인 문제이므로 당면한 문제에는 적용되지 않을 수도 있습니다.

0

여기에 요점은 반환 된 목록에 "기본"개체가 포함되어 있다고 생각합니다. 당신이 마음에 들지 않으면

, 당신은 당신이 당신의 열거 중복이라고 생각한다 무엇

IList<IAudioFile> GetAudioFiles(); 
IList<IVideoFile> GetVideoFiles(); 
+0

죄송합니다. 그러나 파일의 클래스 계층 구조가 나중에 커질 것이라고 언급하지 않았습니다. 그래서 유연한 메커니즘이 필요합니다. –

관련 문제