인터페이스를 구현하는 유형에 대한 매개 변수가없는 생성자를 어떻게 요구할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/26903

문제

방법이 있습니까?

매개 변수없는 생성자를 가지려면 특정 인터페이스를 구현하는 모든 유형이 필요합니다. 수행 할 수 있습니까?

회사의 다른 개발자가 특정 프로젝트에서 사용할 기본 코드를 개발 중입니다.

특정 작업을 수행하는 유형의 인스턴스 (다른 스레드에서)를 생성하는 프로세스가 있으며 특정 계약 (에르고, 인터페이스)을 따르려면 이러한 유형이 필요합니다.

인터페이스는 어셈블리 내부에 있습니다.

인터페이스없이이 시나리오에 대한 제안이 있으면 기꺼이 고려하겠습니다 ...

도움이 되었습니까?

해결책

6 월 Manuel의 말 : <인용구>

그것이 인터페이스에서 계약의 일부가 될 수없는 이유를 이해하지 못하는 이유 중 하나입니다

간접적 인 메커니즘입니다. 제네릭을 사용하면 인터페이스와 함께 유형 정보를 "속이고"전송할 수 있습니다. 여기서 기억해야 할 중요한 점은 직접 작업하는 인터페이스에 제약이 없다는 것입니다. 이는 인터페이스 자체에 대한 제약이 아니라 인터페이스에서 "따라가는"다른 유형에 대한 제약입니다. 이것이 제가 제공 할 수있는 최선의 설명입니다. 두렵습니다.

이 사실을 설명하기 위해 aku 코드에서 발견 한 구멍을 지적하겠습니다. 잘 컴파일되지만 인스턴스화하려고 할 때 런타임에 실패하는 클래스를 작성할 수 있습니다. 라코 디스

뭔가 ITest 에서 파생되지만 매개 변수없는 생성자를 구현하지 않습니다. String은 매개 변수없는 생성자를 구현하기 때문에 잘 컴파일됩니다. 다시 말하지만, 제약 조건은 T, 따라서 ITest 또는 Something이 아닌 String에 있습니다. T에 대한 제약 조건이 충족되었으므로 컴파일됩니다. 그러나 런타임에는 실패합니다.

이 문제의 일부 인스턴스를 방지하려면 아래와 같이 T에 다른 제약 조건을 추가해야합니다. 라코 디스

새로운 제약 : T : ITest 에 유의하십시오. 이 제약 조건은 ITest 의 인수 매개 변수에 전달하는 것이 반드시 ITest 에서 파생 하도록 지정합니다.

그래도 모든 구멍 사례를 막지는 못합니다. A에는 매개 변수가없는 생성자가 있으므로 아래 코드는 잘 컴파일됩니다. 그러나 B의 매개 변수없는 생성자는 비공개이므로 프로세스로 B를 인스턴스화하는 것은 런타임에 실패합니다. 라코 디스

다른 팁

너무 퉁명 스럽지는 않지만 인터페이스의 목적을 오해했습니다.

인터페이스는 여러 사람이 자신의 클래스에서이를 구현 한 다음 사용할 다른 클래스에 해당 클래스의 인스턴스를 전달할 수 있음을 의미합니다.창조는 불필요한 강력한 결합을 만듭니다.

사람들이 인터페이스를 구현하는 사용 가능한 클래스의 인스턴스를 등록하게하거나 요청에 따라 해당 항목을 생성 할 수있는 팩토리를 등록하도록하려면 일종의 등록 시스템이 정말로 필요한 것 같습니다.

후안

안타깝게도 강력한 형식의 언어로는이 문제를 해결할 방법이 없습니다. 컴파일 타임에 Activator 기반 코드로 클래스를 인스턴스화 할 수 있는지 확인할 수 없습니다.

(ed : 잘못된 대체 솔루션 제거) 그 이유는 안타깝게도 인터페이스, 추상 클래스 또는 가상 메서드를 생성자 또는 정적 메서드와 함께 사용할 수 없기 때문입니다. 짧은 이유는 전자에는 명시적인 유형 정보가없고 후자는 명시적인 유형 정보가 필요하기 때문입니다.

생성자 및 정적 메서드에는 호출시 사용할 수있는 명시 적 (코드 바로 그 자리에) 유형 정보가 있어야합니다 . 이는 런타임이 기본 유형을 얻기 위해 쿼리 할 수있는 관련 클래스의 인스턴스가 없기 때문에 필요합니다. 런타임은 호출 할 실제 구체적인 메서드를 결정해야합니다.

인터페이스, 추상 클래스 또는 가상 메소드의 전체 요점은 명시 적 유형 정보 없이 함수 호출을 수행 할 수 있어야하며 이는 인스턴스가 존재한다는 사실에 의해 가능해집니다. 호출 코드에서 직접 사용할 수없는 "숨겨진"유형 정보가 있습니다. 따라서이 두 메커니즘은 아주 간단하게 상호 배타적입니다. 그것들을 혼합하면 어디에서나 구체적인 유형 정보가 전혀 없기 때문에 함께 사용할 수 없습니다. 즉, 런타임에서 호출을 요청하는 함수를 어디에서 찾을 수 있는지 알 수 없습니다.

유형 매개 변수 제약 조건 을 사용할 수 있습니다. 라코 디스

따라서 인터페이스를 구현하는 알 수없는 유형의 인스턴스를 만들 수있는 사물 이 필요합니다. 기본적으로 팩토리 객체, 유형 객체 또는 대리자의 세 가지 옵션이 있습니다. 다음은 주어진 사항입니다. 라코 디스

유형을 사용하는 것은 매우 추악하지만 일부 시나리오에서는 의미가 있습니다. 라코 디스

가장 큰 문제는 컴파일 타임에 Foo가 실제로 기본 생성자를 가지고 있다는 보장이 없다는 것입니다. 또한 성능이 중요한 코드 인 경우 리플렉션이 약간 느립니다.

가장 일반적인 해결책은 공장을 사용하는 것입니다. 라코 디스

위에서 IFactory가 정말 중요합니다. Factory는 기본 생성자를 제공 하는 클래스의 편의 클래스입니다. 이것이 가장 간단하고 종종 최상의 솔루션입니다.

현재 드물지만 더 일반적이 될 가능성이있는 세 번째 솔루션은 델리게이트를 사용하는 것입니다. 라코 디스

여기서 장점은 코드가 짧고 간단하고 모든 생성 방법으로 작업 할 수 있으며 (클로저를 사용하여) 객체를 생성하는 데 필요한 추가 데이터를 쉽게 전달할 수 있다는 것입니다.

형식으로 RegisterType 메서드를 호출하고 제네릭을 사용하여 제한합니다.그런 다음 가장 IT 구현자를 찾기 위해 어셈블리를 걷는 대신 저장하고 거기에서 만듭니다. 라코 디스

그렇지 않은 것 같습니다.

또한이를 위해 추상 클래스를 사용할 수 없습니다.

모든 사람에게 다음 사항을 상기시키고 싶습니다.

  1. .NET에서 속성을 작성하는 것은 쉽습니다
  2. 회사 표준을 쉽게 준수 할 수 있도록 .NET에서 정적 분석 도구를 작성합니다.

    특정 인터페이스를 구현하거나 속성이있는 모든 구체적인 클래스를 가져 오는 도구를 작성하고 매개 변수가없는 생성자가 있는지 확인하는 데 약 5 분의 코딩 작업이 소요됩니다.빌드 후 단계에 추가하면 수행해야하는 다른 정적 분석을위한 프레임 워크가 생겼습니다.

    언어, 컴파일러, IDE, 두뇌-모두 도구입니다.사용하세요!

아니요. 그렇게 할 수 없습니다.상황에 따라 공장 인터페이스가 도움이 될까요?다음과 같은 것 : 라코 디스

Foo의 모든 구현에 대해 생성 방법을 알고있는 FooFactory 인스턴스를 생성합니다.

Activator가 클래스를 인스턴스화하기 위해 매개 변수없는 생성자가 필요하지 않습니다.매개 변수화 된 생성자를 보유하고 Activator에서 모든 매개 변수를 전달할 수 있습니다. MSDN 을 확인하세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top