2014-04-23 2 views
3

나는 나의 OO 지식을 잃어버린 것처럼 느낀다. 사실,이 문제는 간단한 같습니다 나는 "복합 유형"- 제네릭 - 다른 것?

  • 이 같은에서 인터페이스 IDescribedActionsProvider
  • 를 구현 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 (이 양식에서 작동합니다).

    +5

    전혀 문제가 없습니다. 무슨 문제가 있니? –

    +0

    "우리 양식의 일부는 거기에서 상속받지 않지만 인터페이스를 구현할 때는 받아 들일 수있는 매개 변수 여야합니다."왜 IDescribedActionsProvider' 객체를 매개 변수로 받아들이지 않습니까? –

    +3

    다음과 같이 팩토리 메소드를 정의 할 수 있습니다.'public FormController CreateFormController (T controlledForm) T : Form, IDescribedActionsProvider' –

    답변

    1

    "팩토리에서 FormController 객체를 생성하고 싶을 때 문제가 발생합니다 (GenericType이 아닌 OtherType으로 인해) public이 아닌 FormController CreateFormcontroller (T controlledForm)와 같은 함수가 불가능합니다. T는 여기에 정의되지 않았습니다 ... "

    막대의 끝이 잘못되었을 수도 있지만 공장 메서드에서 T를 정의 할 수는 없습니까?

    class Factory 
    { 
        public static FormController<T> CreateFormController<T>(T controlledForm) where T : Form, IDescribedActionsProvider 
        { 
         return new FormController<T>(new OtherType(), controlledForm); 
        } 
    } 
    
    class FormController<T> where T : Form, IDescribedActionsProvider 
    { 
        T _ControlledForm; 
        internal FormController(OtherType otherObject, T controlledForm) 
        { 
         _ControlledForm = controlledForm; 
        } 
    } 
    
    +0

    당신 말이 맞아요,이 방법으로 할 수 있습니다. 내가 그것을 시도했을 때 나는 그 많은 Ts가 틀린 것처럼 본다. –

    0

    제어하려는 모든 양식이 IDescribedActionsProvider 유형 인 것은 아닙니다. 두 가지 방법을 사용할 수 없습니까? :

    abstract class FormController 
    { 
        abstract void Handle(IDescribedActionsProvider form); 
        abstract void Handle(Form form); 
    } 
    
    +0

    죄송합니다, 그게 올바르지 않습니다 : FormController는 controlledForm의 Form 이벤트를 구독하고 IDescribedActionsProvider의 메서드를 호출합니다. 따라서 객체는 둘 다 있어야합니다. –