인터페이스를 구현하는 모든 클래스 (예 : 빈 생성자)에 제약 조건을 설정할 수 있습니까? 제네릭의 where T : new()
제약?인터페이스를 구현하는 클래스의 생성자를 제한 할 수 있습니까?
답변
난 당신이 컴파일 시간에 알 수없는 런타임에 클래스를 제공 할 수있는 것을 생각할 수있는 유일한 방법은 4 가지가 있습니다. 인터페이스를 구현하는 객체의 인스턴스를 제공받을 수 있으며, 인터페이스를 구현할 수 있습니다. 이 시나리오는 인터페이스가 NewSimilarInstance()
메소드를 포함하도록 처리하는 것이 가장 좋습니다. 클래스에 인터페이스에 제약이있는 제네릭 형식 매개 변수가 전달되는 메서드가있을 수 있습니다. 이 시나리오에서 일반 매개 변수를 허용하는 루틴은 new()
제약 조건을 가질 수 있습니다. 그렇지 않으면 .net System.Type
개체 또는 해당 형식에 대한 다른 표현 (해당 문자열)을 제공 할 수 있습니다. 후자의 두 시나리오에서 컴파일 타임 유효성 검사는 의미가 없습니다. 유형을 사용하여 작업을 수행하려면 Reflection이 필요하므로 Reflection을 사용하여 새 인스턴스를 만들 수 있는지 확인할 수 있습니다.
첫 번째 시나리오와 두 가지 시나리오가 혼합 된 것입니다. 내 생각에'NewSimilarInstance()'에 대한 여러분의 제안이 훌륭한 것으로 생각됩니다. 감사! –
아니요, 그런 것은 없습니다. 인터페이스의 일반적인 사용은 인터페이스를 사용하는 코드가 어떻게 인스턴스화되었는지 신경 쓸 필요가 없다는 점을 감안하면 다소 이상 할 것입니다. 구현 클래스가 무엇인지 신경 쓰지 않아야합니다. 인터페이스 만 구현하면됩니다. .
특별한 용도로 사용하는 경우 단위 테스트를 작성하는 것이 좋습니다. 모든 구현이 동일한 어셈블리에 포함될 경우 매우 간단해야하고 오류는 에 잡힐 것입니다. 거의 컴파일 시간과 동일 ...
아니요 - 주어진 인터페이스의 파생 클래스 나 구현 자에게 이러한 제약 조건을 적용 할 수 없습니다.
이러한 제한은 일반적으로 일반적으로 인터페이스로 작업 할 때 일반적으로 해당 인터페이스를 구현하는 객체의 인스턴스를 사용하여 작업 할 때 객체가 자연스럽게 이미 만들어져있는 경우와 같이 유용하지 않습니다. 제약 조건은 중복됩니다. (물론 제네릭 인 경우는 예외이며,이 경우 new()
제약 조건을 사용할 수 있습니다).
내 생각 엔 일종의 플러그인 시스템을 만들려고 시도하고 플러그인 인터페이스의 구현을 제한하여 인스턴스 생성에 사용할 수있는 기본 생성자를 갖기를 원한다고 생각합니다. 그렇다면 정상적으로 존재합니다 MEF과 같은 더 나은 대안을 사용할 수 있습니다.
정확히 필요한 이유에 대해 자세히 설명해 주실 수 있습니까?
인터페이스 유형 매개 변수 (IFoo라고 함)와 함께 제네릭 유형을 사용하고 싶습니다. 불행히도 매우 특별한 조건에서 IFoo 객체를 생성해야한다는 것을 발견했습니다. (나는 이것이 좋지 않다는 것을 안다.) 제네릭 형식에 new() 제약을 적용 할 수 있지만 IFoo에 new()가 없기 때문에 작동하지 않습니다 –
가상 클래스를 사용해야한다고 생각합니다.
추상 클래스를 사용 했습니까? –
그래, 나쁘다. 나는 최근에 많은 VB를 해왔고 그것은 저를 망치고 있습니다. – linkerro
저스틴은 인터페이스를 사용하여 생성자 시그니처를 제한 할 수 없으며 추상 클래스를 사용하여 생성자 시그너처를 제한 할 수 없다고 언급했듯이. 왜 그런 제약이 필요한지 설명하면 문제에 대한 다른 해결책을 찾을 수 있습니다.
인터페이스를 인스턴스화 할 수있는 일반 클래스에 팩토리를 주입하고 new() 제약 조건을 삭제하십시오. 같은
뭔가 :
public interface IFactory<out T>
{
T CreateInstance();
}
public class GenericClass<T>
{
private readonly IFactory<T> _factory;
public GenericClass(IFactory<T> factory)
{
_factory = factory;
}
public DoSomething()
{
//...
T foo = _factory.CreateInstance();
//...
}
}
- 1. 생성자를 호출 할 수 있습니까?
- 2. 인터페이스를 구현하는 Java 클래스가 주석을 자동으로 상속 할 수 있습니까?
- 3. 일반 인터페이스를 구현하는 클래스의 서브 클래스
- 4. 인터페이스는 인터페이스를 구현하는 클래스의 부모로 간주됩니까?
- 5. 상위 클래스의 하위 클래스 생성자를 호출 할 수 있습니까?
- 6. 수퍼 클래스의 생성자를 Mockito/Powermock으로 조롱 할 수 있습니까?
- 7. 제네릭없이 두 개의 인터페이스를 구현하는 것으로 멤버를 정의/제한 할 수 있습니까?
- 8. Java에서 파생 클래스의 인터페이스를 구현할 수 있습니까?
- 9. 인터페이스를 특정 클래스의 유형에 바인딩 할 수 있습니까?
- 10. 구현하는 인터페이스를 통해 구체적인 클래스에 형식 생성자를 적용하려면 어떻게해야합니까?
- 11. Java에서 익명 클래스의 제한?
- 12. parcelable 인터페이스를 구현하는 객체에서 Java 리플렉션을 사용할 수 있습니까?
- 13. 인터페이스를 정적으로 구현하는 클래스의 모든 생성자에 대한 AfterAdvice
- 14. 클래스 이름을 기반으로 인터페이스를 구현하는 클래스의 인스턴스 만들기?
- 15. 자바 처리 1 인터페이스를 구현하는 구체적인 클래스의 오류
- 16. 인터페이스를 구현하는 메소드를 문서화하는 기본 방법이 있습니까?
- 17. 인터페이스를 구현하는 서비스에 바인딩
- 18. Java에서 기본 생성자를 선언 할 수 있습니까?
- 19. deftype을위한 생성자를 정의 할 수 있습니까?
- 20. 생성자를 클래스 밖으로 정의 할 수 있습니까?
- 21. Dojo에서 dojo.declare로 생성자를 오버로드 할 수 있습니까?
- 22. 어떻게 생성자를 호출 할 수 있습니까?
- 23. 어떻게 생성자를 정의 할 수 있습니까?
- 24. 산술 표현식에서 생성자를 호출 할 수 있습니까?
- 25. 캐스트하지 않고도 제네릭 인터페이스를 구현하는 특정 클래스의 팩토리를 얻으려면 어떻게해야합니까?
- 26. 북마크릿을 제한 할 수 있습니까?
- 27. 템플릿을 제한 할 수 있습니까?
- 28. 두 개의 인터페이스를 구현하는 와일드 카드 및 한 클래스의 문제
- 29. 자바의 자바 인터페이스를 구현하는 스칼라 클래스를 사용할 수 있습니까?
- 30. R에 Eureqa 용 인터페이스를 구현하는 사람이 있습니까?
아니요, 인터페이스로 생성자를 제한 할 수 없습니다. – dasblinkenlight