2013-05-15 4 views
1

제네릭과 그 적절한 선언/사용에 관해서도 여전히 문제가 있습니다. 나는 전제를 얻었지만, 제네릭의 ins-n-out의 일부는 여전히 나를 피한다.모름없이 매개 변수로 제네릭 타입을 지정하십시오. T

다음 코드 (컴파일 및 코드 냄새 포함되지 않음)을 감안할 때 : 왜이를 지정해야합니까

  • :

    public interface IUIConcern<out T> where T : IUIConcernExtension 
    { 
    
        string Name { get; } 
        Func<T> Extend(); 
    } 
    
    public class UIConcern 
    { 
        public static void Register<T>(string concernName, IUIConcern<T> uiConcern) where T : IUIConcernExtension 
        { 
         Concerns.Add(uiConcern); 
        } 
    
        public static List<IUIConcern<T>> Concerns{ 
         get { 
          // Logic... 
         } 
         set { 
          // Logic... 
         } 
        } 
    } 
    

    ... 나는 몇 가지 질문을 부품 public static void Register<T>(string concernName, IUIConcern<T> uiConcern) where T : IUIConcernExtension 이미 제약이있는 경우

  • 어떻게 작성해야합니까? 나는 이 내 IUIConcern<T>을 모르는 채 T을 모르는 것이고 IUIConcernExtension에서 파생된다는 것을 알고 있습니까?

다시 컴파일해야하며 올바르지 않습니다. IUIConcern<> 요소가 여러 가지 일 수있는 일반적인 항목의 목록을 어떻게 보관할 수 있는지 알고 싶습니다.

감사합니다.

답변

2

당신은 예를 들면, 기본 인터페이스가 필요 :

public interface IUIConcern 
{ 
    string Name { get; } 
} 

public interface IUIConcern<out T> : IUIConcern where T : IUIConcernExtension 
{ 
    Func<T> Extern(); 
} 

당신이 Concerns을 정의하는 것이며, Register 당신이 T을 치료하는 방법에 따라 달라집니다 방법. 또는 T을 알고있는 인스턴스 만 처리하는 경우 Dictionary<Type, List<IUIConcern>>을 사용하여 컨트롤러 코드에 필요한 항목에 따라 무엇이든 저장하거나 잠재적으로 기본 인터페이스를 삭제하고 object을 사용하여 저장할 수 있습니다.

2

문제는 인터페이스에 없지만 정적 메서드와 속성을 사용하는 일반 구현 때문에 문제가 발생합니다.

IUIConcernExtension을 정의해야한다고 Guante의 대답이 정확했지만 당연히 논리적입니다. 따라서 직면 한 문제에 대해 중요하지 않으므로이 부분을 생략했다고 가정합니다.

코드의 문제는 당신이 일반적인 정의 클래스 수준, 에 누워하지로, 정적 방법 및 절차가있는 클래스를 만들었지 만 한 것입니다 방법이 때문에, 속성을을 수준에 그 가지고 있고 방법은 당신이 항상 같은 타입으로 있다고 가정 할 수 없습니다 !!

당신이 전화를 말할 수 있습니다 전화 :

Register<string>("something", UIConcern<string>) 

하지만 그 전에 이미 불렀다을 :

Register<Type>("something", UIConcern<Type>) 

어떻게 컴파일러가로 수 있었다! 그래서 대답은 클래스 수준에서 제네릭 형식을 정의하는 것입니다.이 모든 속성과 메서드는 동일합니다.

interface IUIConcernExtension 
{ 
    string Name { get; } 
} 

public interface IUIConcern<out T> where T : IUIConcernExtension 
{ 
    Func<T> Extend(); 
} 

public class UIConcern<T> where T : IUIConcernExtension 
{ 
    private static List<IUIConcern<T>> _Concerns = new List<IUIConcern<T>>(); 

    public static void Register(string concernName, IUIConcern<T> uiConcern) 
    { 
     Concerns.Add(uiConcern); 
    } 

    public static List<IUIConcern<T>> Concerns 
    { 
     get { return _Concerns; } 
     set { _Concerns = value; } 
    } 
} 
:

또한 당신은 당신이 정적 최선을 다하고 있기 때문에, 정확한 코드가 있어야합니다, 당신의 목록의 private 멤버를 사용할 필요가

관련 문제