나는 나의 OO 지식을 잃어버린 것처럼 느낀다. 사실,이 문제는 간단한 같습니다 나는 "복합 유형"- 제네릭 - 다른 것?
를 구현 System.Windows.Forms.Form에서하는
- 상속 객체에서 작동하는 클래스를 만들려면 시각.
공용 추상 클래스 SpecialForm : Form, IDescribedActionsProvider 을 만들 수 있으며 해당 SpecialForm 유형의 매개 변수가 필요합니다.
여기서는 작동하지 않습니다. 우리 양식의 대부분은 OurCompanyForm을 상속하며 IDescribedActionsProvider를 구현할 필요가 없으며 우리 양식의 일부는 상속하지 않지만 인터페이스를 구현할 때 허용되는 매개 변수 여야합니다. 이것은 입니다. 여기에 필요한 것은입니다. 은 상속하지 않습니다..
그럼 제네릭을 생각했습니다. 나는 내가 의도 한 방식으로 작동 할
public class FormController<T> : IDisposable where T : Form, IDescribedActionsProvider { T _ControlledForm; OtherType _OtherObject; internal FormController(OtherType otherObject, T controlledForm) { _OtherObject = otherObject; _ControlledForm = controlledForm; .... }
처럼 내 클래스를 정의 할 수 있지만, 그것은 완전히 잘못된 느낌 : 즉, 제네릭에 대한 의미했다 (http://msdn.microsoft.com/en-us/library/sz6zd40f%28v=vs.100%29.aspx에서 MSDN 참조) 게 아니에요. 팩토리에서 FormController 객체를 생성하려고 할 때 문제가 발생합니다 (예 : 거기에 생성 된 OtherType으로 인해). 일반 함수가 아닌 것입니다. public FormController CreateFormcontroller (T controlledForm) T가 없으므로 불가능합니다. 여기에 정의 ... 그리고 T 대신 "SpecialForm"을 사용하는 것은 상속과 구성으로 인해 작동하지 않습니다.
무엇을 제안합니까? "Duck Typing"-하지만 좋은 OO 실습이 아닌가?
편집 :이 형태의 이벤트를 설명하고 인터페이스의 메소드를 호출하기 때문에
목적하는 것은 FormController에 전달 될이 두 가지 유형이어야합니다.
Boris B.의 코멘트와 Weyland Yutani의 답변에 설명 된대로 공장 방법으로 T를 정의합니다.
그러나이 문맥에서 Generics의 사용에 대해서는 여전히 의문이 있습니다. T controlledForm 매개 변수는 단일 개체이며, FormController 클래스의 해당 "형식"인스턴스는 하나뿐입니다. 구체적 유형은 중요하지 않습니다. - 예와는 분명히 다르다. 목록 <int>. 필자는 FormController 객체를 "필요로하지 않습니다."단지 FormController (이 양식에서 작동합니다).
전혀 문제가 없습니다. 무슨 문제가 있니? –
"우리 양식의 일부는 거기에서 상속받지 않지만 인터페이스를 구현할 때는 받아 들일 수있는 매개 변수 여야합니다."왜 IDescribedActionsProvider' 객체를 매개 변수로 받아들이지 않습니까? –
다음과 같이 팩토리 메소드를 정의 할 수 있습니다.'public FormController CreateFormController (T controlledForm) T : Form, IDescribedActionsProvider' –