C # 제네릭 형식 매개 변수는 그것의 매개 변수 방법의 생성자를 제한 할 수있다?

원본 : 인수 생성자가 할로 C #을 제네릭 형식 매개 변수는 방식을 제한 할 수있다?

제목을보고 난 후에 검토 그래서 그것을 추정되고, 자신의 매우 부끄러워 가난한 언어 능력을 오전 ... 용서해주십시오 ...... 내가 특별히의 시작 부분으로 다시 문구를 썼다 ......

 

 

문제

하나의 문제는 그저께가 발생, 그래서 MSDN에 부탁했다 단지 제네릭에 대해, 다음 질문을 풍요롭게.

최근 시도는 다음과 같은 EF 종종 이상한 아이디어, DDD "모델 첫 번째 제네릭 지원을 추가 할 수 있습니다 EF을." 이것은 "인수 제네릭 형식 제약 모드가 있는지 여부"입니다.

구체적인 아이디어는 내가 제네릭을 사용할 때, 내가 유형 매개 변수를 인스턴스화 할 필요가 있음을 발견, 매우 간단합니다 :

1   MyClass의 <T>
 2-  {
 3      공개 MyClass1 ()
 -4-      {
 5           .MyObject = 새로운 T ();
6      }
 7  
8      T MyObject를 { 얻을 ; 설정 ; }
 9 }

물론, 위의 오류가 될 것입니다 .

T의 에러 내용은 얻을 검토 MSDN에서 새로운 제약 (새 제약),하지 제네릭 형식 매개 변수의 새로운 제약 조건의 내용을 .

그래서 다음 올바른 코드는 다음과 같습니다

1   MyClass의 <T>
 2      여기서 T : 새로운 ()
 3-  {
 4-      공개 MyClass1 ()
 5      {
 6           .MyObject = 새로운 T ();
7      }
 8  
9      T MyObject를 { 얻을 ; 설정 ; }
 10 }

 

그런 후에 나는 내가 매개 변수를 기반으로 새로운 객체를 생성해야하고, 방법은 가장 적합한 일반 생성자에서 구현되는, 그래서 나는이 코드를 가지고 희망을 발견 :

1   MyClass1 <T>
 2      여기서 T : 새로운 ( 문자열 )
 3-  {
 4-      공개 MyClass의 ( 문자열 요청)
 5      {
 6           .MyObject = 새로운 T (요청);
7      }
 8  
9      T MyObject를 { 얻을 ; 설정 ; }
 10 }

불행하게도,이 경우는 매우 잘못된 것하고 검토 일반 목록 제약 방법을 찾을 같은 제약의 매개 변수가없는 생성자를 .

 

그래서 난 그냥 위에서 무슨 일이 있었 MSDN이 질문에 질문 추구, "우아한 해결책을."

 

일반 두 가지 유형에서와 마찬가지로 문제가 대답 솔루션뿐만 아니라, 내가 두 사람은 매우 불행 시도, 우리는보고를 켭니다.

그는 추가 :

  • 에 의해 James.Ying의 알림뿐만 아니라 생성자에서 전달
  • Activator.CreateInstance로 더불어 @Choo가 생각 나게

 

 

공장 패턴

첫 번째는, 팩토리 패턴입니다, 팩토리 클래스를 구축 코드를 살펴하는 것입니다, 이것은 공장 패턴에 얽힌하지 않는, 작성하는 한 가지 방법은 다음과 같습니다

1   MyClass의 <T, TFactory>
 2      여기서 TFactory :하는 IFactory <T> 새로운 ()
 3-  {
 4-      공개 MyClass의 ( 문자열 요청)
 5      {
 6          VAR의 공장 = 새로운 TFactory ();
7  
8           .MyObject = factory.New (요청);
9      }
 10  
11      T MyObject를 { 얻을 ; 설정 ; }
 12  }
 13  
14  인터페이스 하는 IFactory <T>
 15  {
 16     T 새로운 ( 문자열 요청);
17 }

구현, 당신은 발견 할 것이다 항상 재사용 로직의 유형과 제네릭의 사용을 줄일 수있다, 그 자체가 일반적인 의미가 높지으로 이러한 요구는, 팩토리 클래스를 각 파생 클래스 또는 인스턴스에 대한 범주를 만들고 유지하기 위해 .

 

 

추상 기본 클래스의 정적 추상적 인 방법

당신은 멀티 클래스를 유지하지 않으려면, 다음 대상 클래스를 시작하는 것입니다, 그래서 우리는 대상 클래스의 기본 클래스를 생성 할 수 있습니다 :

1   MyClass의 <T>
 2      여기서 T : TBase, 새로운 ()
 3-  {
 4-      공개 MyClass의 ( 문자열 요청)
 5      {
 6           .MyObject = T.New (요청);
7      }
 8  
9      T MyObject를 { 얻을 ; 설정 ; }
 10  }
 11 개  
12  추상  클래스 TBase
 13  {
 14      공용  추상  정적 TBase 새 ( 문자열 요청);
(15) }

앞서이라고하는 고민, 처음 일을 방지하기 위해, 그 잘못 컴파일 쓰기!

제약 잘못이 아니라 그것을보고 된 오류와 유사하다 "T 그렇게 사용할 수없는 형식 매개 변수입니다!"( 'T'는되고 주어진 컨텍스트에서 유효하지 않은 '형식 매개 변수').

 

 

생성자에서 들어오는

기본적인 접근하지만, 잊지도있다 James.Ying 그것을 생각 나게, 일반 클래스 생성자에서 전달됩니다.

클래스 MyClass의 <T>
     여기서 T : TBase, 새로운 () 
{ 
    공중 MyClass의 (T 인 myObject) 
    { 
         .MyObject = 인 myObject; 
    } 

    T MyObject를가 { 얻을 ; 설정 ; } 
}

이러한 방식으로 일반 클래스보다 간결 것으로, 발신자, 위쪽에 약간 의존에 인스턴스화 과정 (사실, 구현 및 제네릭 발신자 또는 후임자에게 넘겨해야합니다 모든이 같았다).

장점은 단점이 생성자를 사용하여 인스턴스화 것을 보장 할 수 있다는 것입니다, 간단한 일반적인 것은 T (문자열)입니다. 또한, 코드의 재사용 성을 감소시킬 수있다. 조건, 그리고 논리의 모든 파생 클래스의 가상적인 예는 일반적인 기본 클래스에 달성하기 위해 여전히 더 균일하다.

간단한 경우에 이것은 가장 우아한 방법에 대한 일반적인이다.

 

 

Activator.CreateInstance로

이 방법은 될 수 http://msdn.microsoft.com/en-us/library/system.activator.createinstance(v=vs.110).aspx 더 분명 있음을 나타냅니다 볼 수 :

가장 일치하는 생성자와 형식의 인스턴스를 생성 (가장 지정된 매개 변수와 일치하는 생성자를 사용하여 지정된 형식의 인스턴스를 만듭니다).

쓰기도 매우 재미있다 :

클래스 MyClass의 <T> 
{ 
    공개 MyClass의 ( 문자열 요청) 
    { 
         .MyObject = (T) Activator.CreateInstance로 ( 대해서 typeof (T) 요청); 
    } 

    T MyObject를가 { 얻을 ; 설정 ; } 
}

이 방법은 할 수있는, 매우 짧은, 그것은 더 인터페이스와 기본 클래스를하지 않습니다.

단점은 T는 생성자가, 또는 여부를 지정된 매개 변수 및 유형 생성자 수 있도록 할 수있는 방법이 없습니다, 바인딩되지 않습니다.

T이 충족되지 않을 경우 설계 요구 사항은 경우보고됩니다 적절한 예외 .

 

 

원래 제네릭 형식 매개 변수 때문에 설계

인스턴스화 또는 상속 할 때이 시점에서, 우리는 C #을 제네릭, 알, 유형 매개 변수가 "비 클래스"제약 조건 유형 매개 변수의 존재이다 (유형 매개 변수에 대한 제약은) 단지 필요한 특정 클래스를 설명하는 데 사용되는 조건을 달성한다. 제네릭 형식 매개 변수의 내부에서 그것은 단지 클래스를 설명하는 데 사용되는 "특별한 존재"이지만, 클래스는 사용할 수 없습니다.

 

 

그런 다음, 유형 매개 변수가 참조 용지를받을 수 있습니다 ... ...

우선, 사실, 문제 자체가 제네릭 형식 매개 변수는 다음과 같은 매개 변수와 방법의 예를 가질 수있다  T 인 myObject = 새로운 새로운 T ( " 여보세요 세계!")  .

매개 변수 유형은 "바인딩"이기 때문에이 제네릭 형식 매개 변수가 같은 매개 변수를 생성자 제약 조건 방식을 가질 수 있습니다 문제가되도록 그런 다음 방법을 클래스의 인스턴스의 특성을 설명하기 위해  WHERE T : 새로운 새로운 ( 문자열 )  .

가정 마십시오, 다음, 초기 문제의 위조는, 그것은 원칙의 문제가 발생합니다 여부를 증명하기 위해 존재한다.

첫 번째는 생성자와 방법의 매개 변수로 제네릭 형식 매개 변수 제약 모드가 있더라도 다음, 인수 생성자와 방식으로 결합 된 제네릭 형식 매개 변수를 비교할 수있다? 인수 생성자가 제네릭 형식 매개 변수 생성자 제약으로 증명하고 문제가 발생하지 않습니다 기술적으로 달성 할 수없는 최소한의 제네릭 형식 매개 변수가 결합되었습니다. (......)

새로운 객체의 예에서 보통 두 가지 방법으로 할 때 초기화됩니다 :

  • 생성자의 매개 변수 전달을 사용하여
  • 할당을 인스턴스화 한 후

대부분의 경우 그 결과는 거의 대부분의 경우에 의미 일반적 속성을 포함하거나 매개 변수 (공개)에 개시되어 두 가지 방법으로, 원래 개방 읽기와 쓰기, 내부 및 외부 쓰기 쓰기에서 생산되는 그들은 유사하다.

그러나 이러한 매개 변수를 사용하여 작동하는 데 필요한 몇 가지 비즈니스 제약, 또는 공정 파라미터와 같은 경우를 발견, 최종 연산 결과 (개인) 개인, 그것은 생성자의 매개 변수 전달을 선택하는 경향이있다. 아니면 특별한 방법을 사용, 데이터 클래스에 의해 프로세스가 다음 인스턴스화 작동하는 데 필요한 가져 왔어 후, "일관성"상쾌한 아래에 작은을한다.

그것이 속한 대부분의 경우에 최적의 솔루션이기 때문에 생성자의 매개 변수 전달을 사용하면 쉬운 다른 방법이 아니다 . 때로는 거래 자체가 강한 자성이 있기 때문에 하나 모두가 최고, 사용하는 객체를 초기화합니다. 당신은 가끔 흐리게 객체를 초기화하는 방법은 두 가지 클래스의 사용자로 두 항목에 대한 문제가있다 정확하게 파악 할 수없는 두 가지 방법으로 생성 된 결과, 개발자를위한, 두 구현 사양도 필요 둘 중 하나를 선택하거나 모두 일관성을 보장하기에 나타납니다. 클래스가 상대적으로 복잡하게되면, 상황은 그렇게 간단하지 않다.

그래서, 우리는 정말 제네릭 형식 매개 변수가 결합 된 방식으로 생성자의 매개 변수와 함께 장면을해야합니다 필요합니다. 가 필요하지 않습니다,하지만 확실히 필요하지만, 같은 / 그 접근 설정하세요.

 

 

또한, 사실 더 큰 명제는 인수의 유형이 클래스로 사용할 수있는 것입니다

이 클래스로 사용하도록 제한으로 다음 안내 할 수 있습니다, 매개 변수를 사용하여 생성자에 의한 제약 조건을 가정 할 수있다? 예를 들어, 정적 메소드를 호출? 제네릭 형식 매개 변수에서 상속하는 클래스를 만드시겠습니까?

이러한 연산자의 모든 간단한 구현이 해결 될 수 있습니다보다는, 모든 특별한 경우에서 발견 될 가능성이 높다.

및 클래스 일반 클래스 복잡해진다 파라미터의 유형에서 상속 만들고, 예를 들면, () T 명확 클래스 수에 관련 될 때 실행되는 정적 메소드를 호출 T.Hello.

그냥 클래스 메소드를 호출 생각 ". 단순한 일반적인 문제 자체"MyClass에 <T> .MySubClass, 문법 여기에 약간의 "특별한", 그리고하지 않을 수 있습니다

그는 좀 더 많은 기능에 의한 높은 힘 그리드 C 번호에 대한 올바른 경로 또는 하나 개의 언어, 그것은 말했다?

 

 

주제에

당신이 불만족하는 경우, 그들은 적절한 제목을 제공 할 수 있습니다, 공격 할 수있는 방법 금지 저자!

 

 

 

 

추천

출처www.cnblogs.com/lonelyxmas/p/11286112.html