2013-06-27 1 views
0

열거 형을 사용하는 데 문제가 있습니다. 내 장치 컨테이너에서 사용할 장치를 지정하기 위해 외부 클라이언트가 사용하는 DeviceType의 이름을 지정하는 enum을 정의했다고 가정 해 보겠습니다. 하지만 enum은 확장 할 수 없기 때문에 라이브러리를 업데이트하지 않고 모든 사용자가 새 버전으로 업데이트하지 않고도 새 장치를 가질 수는 없습니다. 가능한 한이 문제에 대한 간단한 해결책을 찾고 있습니다. 저는 속성이나 다른 .NET "속임수"를 사용하고 싶지 않습니다.열거 형을 변경하는 디자인 패턴?

public class Program 
{ 
    private static List<IDevice> devices; 

    public static void Main(String[] args) 
    { 
     devices = new List<IDevice>() 
     { 
      new NetworkDevice() 
     }; 
     IEnumerable<IDevice> currentDevices = GetDevices(DeviceType.Network); 

     IEnumerable<IDevice> newDevices = GetDevices(DeviceType.NewNetwork); // Will not work, unless client updates my library to get newly added enum types 
    } 

    private static IEnumerable<IDevice> GetDevices(DeviceType type) 
    { 
     return devices.Where(device => device.Type == type); 
    } 
} 

public enum DeviceType 
{ 
    Network 
} 

public interface IDevice 
{ 
    DeviceType Type { get; } 
} 

public class NetworkDevice : IDevice 
{ 
    public DeviceType Type 
    { 
     get 
     { 
      return DeviceType.Network; 
     } 
    } 
} 
+0

?????????????? –

+0

그냥 열거 형 대신'사전'을 사용할 수 있습니까? –

+3

기본적으로 "열거 형을 사용하고 싶지만 열거 형은 내가 원하는 것을 할 수 없다"는 말처럼 들립니다. 열거 형을 사용하지 않는 것이 좋습니다. – bengoesboom

답변

2

유형을 나타내는 데 enum을 사용하면 클래스를 hierachy로 만들어야한다는 것을 의미합니다.

마찬가지로 형식을 나타내는 열거 형의 switching은 일반적으로 해당 계층 구조의 어딘가에 소개되기를 원하는 하나 이상의 가상 메서드가 있음을 의미합니다.

열거 형을 어떻게 사용 하시겠습니까? 그 대신 가상 메소드에 대한 호출로서 그 사용법을 표현할 수있는 방법이 있습니까? AS를

(질문의 코드가 필터링되는 특정 유형의 장치를 표시하지만, 그들이 발견 한 후 해당 항목에 대한 부르는 방법이 표시되지 않습니다.)

[편집]

대안으로, 당신은 이것을 가지고 완전 핵으로 갈 수 있고 Managed Extensibility Framework을 사용할 수 있습니다. 그 종류의 당신의 "부정 행위"규정을 위반 ...;)

+0

열거 형을 사용하지 않아서 기쁩니다. 그러나 클라이언트 코드에서 요청 된 새 장치를 지원할 수 있도록 클래스 구조를 변경하는 방법을 모르겠습니다. 사용 클라이언트 코드에 대해서는 IDevice 인터페이스 메서드를 사용합니다 ("void Init()"등)하지만 상속을 통해 특정 구현을 사용합니다. –

+0

@ user2528957 "플러그인" 관리 확장 성 프레임 워크와 같은 아키텍처 : http://msdn.microsoft.com/en-us/library/dd460648.aspx –

+0

ok 나는 그것을 파헤 치려고합니다. –

0

가장 좋은 건 우리가 List<string>이며 일부 백엔드 데이터 저장소에서 채 웁니다. 이를 통해 데이터 저장소를 관련 값인 List<string>에 사용할 유효한 값으로 업데이트 할 수 있습니다.

public enum DeviceType 
{ 
    Network 
} 

는 더 이상 존재할 필요가 없을 것입니다, 단지 문자열

public interface IDevice 
{ 
    string Type { get; } 
} 

@Matthew이 좋은 포인트가를 사용하려면의 iDevice를 업데이트 할 것입니다. 그러나 코드를 다시 컴파일하지 않고 값을 변경할 수있는 주된 관심사가있는 경우 위와 비슷한 사항이 필요합니다.