2017-11-28 7 views
-4

입력 확인을위한 여러 가지 방법이있는 Form이 있습니다. 이 유효성 검사 로직을 여러 FormUserControl 사이에서 공유하고 싶습니다. 기본 클래스의 유형은 무엇이되어야합니까? UserControl에도 사용되기 때문에 Form이 될 수 없으므로 Form에도 사용되기 때문에 UserControl이 될 수 없습니다.폼 및 사용자 컨트롤 모두에 대한 하나의 기본 클래스

내 직감은 솔루션에 제네릭이 포함될 수 있다고하지만 확실하지 않습니다.

참고 : "유효성 검사 논리"에 의해 인터페이스는 해결책이 아니다 그래서 나는의 구현를 참조하십시오. 내가 실제로 입력을 검증하기위한 별도의 클래스를 할 :


편집 (질문 좀 명확하게하기 위해). 그러나 입력이 유효하지 않음을 사용자에게 알리기 위해 ErrorProvider을 사용합니다. 내 InputValidator 클래스는 ErrorProvider을 사용하여 오류를 사용자에게 표시하는 Form/UserControl 내부의 메서드를 호출합니다. 나는 단지 Form/UserControl마다이 방법을 복사하여 붙여 넣기를 원치 않는다.

+0

양식은 컨트롤의 일부를 상속받습니다. 그러나 이것이 검증 로직을 논쟁의 여지가있게 만드는 가장 좋은 장소입니다. – user6144226

+0

양식에 유효성 검사를 포함하지 마십시오. 검증 로직을 위해 별도의 클래스를 생성하십시오. 양식의 모든 데이터는 메소드 매개 변수 또는 특성으로 전달 될 수 있습니다 (새 클래스로 그룹화 될 수도 있음). –

+0

@Sipo - 상속 계층 구조는 쉽게 확인할 수있는 문제이므로 (docs/visualStudio) 질문은 다소 잘못 표현되거나 구성 될 수 있습니다. 알고 싶은 것은 재사용 가능한 유효 로직을 연결하는 방법입니다. – user6144226

답변

1

첫 번째 것은 첫 번째입니다. 올리비에의 대답은 아주 좋은 것으로 생각합니다. 사용을 권합니다.
그러나 FormUserControl의 기본 클래스를 변경할 수는 없지만 인터페이스 및 확장 메서드를 사용하여 한 번만 메서드를 작성하는 방법이 있습니다. 여기에 대한 답변을 보려면 여기를 클릭하십시오.

인터페이스 :

internal interface IValidatable 
{ 
    ErrorProvider ErrorProvider {get;} 
} 

확장 클래스 :

internal static class IValidatableExtensions 
{ 
    internal void ShowValidationResult(this IValidatable self, ValidationResult result) 
    { 
    // Here you can use self.ErrorProvider to show your results 
    } 
} 

지금 당신은 당신의 형태를 가질 수 있고 사용자 컨트롤이 IVilidatable 인터페이스를 구현하고 검증 클래스에서 단순히 ShowValidationResult 메서드를 호출합니다.

올리비에가 해답을 제시 한 것처럼 유효성 검증 인스턴스를 errorProvider에 보내면이 기술은 다른 경우에 유용 할 수 있으므로 직접 대답을 추가하는 것이 좋습니다.

3

Forms와 UserControls를 모두 처리하는 기본 클래스를 만들 수 없습니다. 그러나 Forms 클래스와 UserControl 클래스의 기본 클래스를 만들 수 있습니다.

또한 기본 클래스가 구현하고 유효성 검사기에서 사용해야하는 멤버를 게시하는 인터페이스를 만듭니다.

이 방법을 사용하면 복제되는 코드의 양이 최소한 두 곳으로 줄어 듭니다. 디자이너가 몇 가지 제한 사항을 도입하기 때문에 Windows Forms의 컨텍스트 (예 : 추상 클래스)에서는 작동하지 않을 OOP 관행이 있습니다.


원래 답 :이 경우
은 최선의 선택은 자신의 별도의 클래스에 유효성 검사 논리를 이동하는 것입니다. Forms 및 UserControls에서이 새 클래스를 사용할 수 있습니다.

유효성 검사 중에 Form 또는 UserControl을 참조해야하는 경우 ContainerControl 유형의 매개 변수를 사용할 수 있습니다. 이 클래스는 Form과 UserControl의 기본 클래스입니다. 이렇게하면 ContainerControl에서 상속 한 모든 클래스에 대해 작동하는 공유 논리를 만들 수 있습니다.

+0

시간 내 주셔서 감사합니다. 더 명확하게 질문을 편집했습니다. 제 편집을 검토하십시오. – Sipo

2

상속 대신 컴포지션을 사용하십시오. 참조 : Composition over inheritance (위키 백과).

양식은 Form 또는 Form에서 상속 된 다른 양식으로 상속해야합니다. 사용자 컨트롤은 UserControl 또는 UserControl에서 상속 한 다른 사용자 컨트롤에서 상속해야합니다. 이를 변경할 수 없으므로 둘 다 자신 만의 기본 클래스를 제공 할 수 없습니다.

대신 검증 로직을 별도의 클래스로 구현하고 폼과 사용자 정의 컨트롤에서 사용하십시오.

public partial class MyForm : Form 
{ 
    private readonly MyValidation _validation; 

    public Myform() 
    { 
     InitializeComponent(); 
     _validation = new MyValidation(errorProvider1); 
    } 

    //TODO: use _validation instead of inherited validation logic. 
} 

유효성 검사가 무엇인지 모르기 때문에 정확하게 구현하는 방법에 대해 자세히 설명해 드릴 수 없습니다.

+0

감사합니다. 제가 말했던 "유효성 검증 로직"은 실제로 유효성 검사의 시각적 측면, 즉 ErrorProvider를 사용하여 사용자에게 오류를 보여주는 것입니다 (질문에서 편집 참조). 정말로'ErrorProvider' 로직을 별도의 클래스에 추출 할 수 있습니까? – Sipo

+0

보통 비즈니스 클래스에'IDataErrorInfo' 인터페이스 (그리고 아마도'INotifyPropertyChanged')를 구현하고 거기서 유효성 검사를하고 양식에 오류를 보여주는'ErrorProvider' 컴포넌트를 위치 시키십시오. 양식. 그래서 어떤 종류의 논리가 필요한지 모르겠습니다. –

+0

'ErrorProvider'는 밀폐 된 클래스가 아닙니다. 따라서 자체 오류 공급자를 파생시켜 추가 논리를 추가 할 수 있습니다. –