2017-12-17 4 views
1

사용자 지정 컨트롤이 두 개 있습니다 (CustomTextBoxCustomNumericUpDown). 몇 가지 방법과 몇 가지 속성으로 구성된 공유 된 동작을 원합니다. 공유 동작을 포함하는 추상 클래스를 확장해야다른 사용자 정의 컨트롤간에 동작을 공유하는 방법?

  1. 모두 :

    솔루션은 내가 함께했다. 문제는 하나가 TextBox을 확장하고 다른 하나가 NumericUpDown을 확장한다는 것입니다. C#에서 허용되지 않는 다중 상속을 제외하고는 둘 다 내 추상 클래스를 상속하는 방법을 생각할 수 없습니다.

  2. 공유 인터페이스를 구현하십시오. 이것은 인터페이스가 구현을 가질 수 없기 때문에 분명히 어리 석다.
  3. 확장 방법 사용. 보다 구체적으로 말하자면, 둘 다 인터페이스를 공유하고이 인터페이스의 확장 메소드를 작성하십시오. 문제는 you cannot (currently) have extension properties in C#이며, 실제로는 getter 및 setter를 the principle of least astonishment로 인해 실제 메소드를 사용하여 구현하고 싶지 않습니다.

반복적 인 코드가 포함되지 않은이 문제에 대한 우아한 접근 방식이 있습니까?


편집 : 예를 들어


, 나는 ValidateInput() 방법 및 ValidationRules 속성을 가지고 CustomTextBoxCustomNumericUpDown 모두를 원한다. 즉, 둘 다 메소드와 속성을 추가하려고합니다.

다음
+0

[특성] (https://en.wikipedia.org/wiki/Trait_(computer_programming))에 대해 설명하는 것처럼 들립니다. _default 인터페이스 methods_에 대한 지원은 [제안]되었습니다 (https : // github.com/dotnet/csharplang/blob/master/proposals/default-interface-methods.md) 향후 버전의 C# – lesscode

+0

"공유 된 동작"은 개별 파생 컨트롤의 특성에 의존하거나 공통 기본 제어 클래스? – lesscode

+0

@lesscode, 개별 파생 컨트롤의 특성에 의존합니다 ... – Sipo

답변

1

내 생각은 두 컨트롤의 일반적인 기능을 가진 클래스를 만듭니다

,

당신은

public class CommonFunctions 
{ 
    public void ValidateInput(Object sender){ 
     // do your validation logic 
    } 
} 

public class CustomTextBox : TextBox 
{ 
    private CommonFunctions _commonFunctions; 

    public CustomTextBox(CommonFunctions commonFunctions) 
    { 
      _commonFunctions = commonFunctions; 
    } 

    private void Control_TextChanged(Object sender,EventArgs e) 
    { 
       _commonFunctions.ValidateInput(sender); 
    } 

} 

public class CustomNumericUpDown : NumericUpDown 
{ 
    private CommonFunctions _commonFunctions; 

    public CustomNumericUpDown(CommonFunctions commonFunctions) 
    { 
      _commonFunctions = commonFunctions; 
    } 

    private void Control_TextChanged(Object sender,EventArgs e) 
    { 
       _commonFunctions.ValidateInput(sender); 
    } 
} 
+0

저를 도와 주셔서 감사합니다! 솔루션을 사용하여 공통 속성 문제를 해결하는 방법은 무엇입니까? – Sipo

+0

'TextBox'와'NumericUpDown'에는 속성이 다릅니다. 결합 할 수 없습니다. 관심이 필요한 속성을 추가하십시오. – programtreasures

+0

질문 편집을 검토하십시오. – Sipo

0

이를 만들 일반적인 기능은 일반 클래스를 형성에 액세스 할 수 있습니다, 모두 컨트롤 초기화에 주입 공통 기능을 포함하는 기본 클래스 필요한 각 컨트롤에 대해 클래스를 확장하고 그 클래스 안에 컨트롤을 배치하십시오.

public class MyUserControl : UserControl 
{ 
    public MyUserControl() : base() 
    { 
    } 
    // add common behaviour here (validation, etc) 
} 

public class MyTextBox : MyUserControl 
{ 
    public MyTextBox() : base() 
    { 
     Add(new TextBox()); 
    } 
    ... 
} 
+0

예를 들어 자세히 설명해 주시겠습니까? – Sipo

+0

샘플 코드 –

+0

편집 시간을내어 주셔서 감사합니다! 나는 당신의 해결책을 이해하고 있는지 확신하지 못합니다. 'Add' 메소드는 어디에서 왔으며 그 목적은 무엇입니까? – Sipo

1
멀리 우아한에서

하지만 파생 된 컨트롤의 특정 구현 세부 정보에 의존 할 필요가없는 경우, 당신은 속성과 메소드 당신이 원하는의 구현을 적용 (인터페이스의 조합을 사용할 수 있습니다) 및 delegation (공유 동작을 캡슐화/중앙화하기 위해).

파생 된 컨트롤의 인터페이스 구현은 완전히 상용구이며 항상 다른 곳에서 위임합니다.

그러나 유효성 검증 동작이 파생 컨트롤의 특정 세부 정보에 의존하는 경우이 접근법은 복잡해집니다.

관련 문제