2010-06-08 2 views
2

속성과 메서드를 지정하려는 일부 사용자 정의 컨트롤이 있습니다.인터페이스와 기본 클래스가 섞여 있고,이를 구현하는 올바른 방법입니다.

그들은 모두 "Foo"및 "Bar"와 같은 속성을 갖고 있기 때문에 기본 클래스를 상속합니다. 기본 클래스를 사용한 이유는 각 속성에서 모든 속성을 수동으로 구현하지 않아도되기 때문입니다. 수업.

그러나 기본 클래스는 메서드를 "수행"하는 방법을 모르기 때문에 기본 클래스가 아닌 파생 클래스에만있는 메서드가 필요하므로 인터페이스를 사용하려고 생각하고 있습니다. 이것 때문에. 기본 클래스에 넣으면 값을 반환하도록 몸체를 정의해야하며 (잘못된 것임) 항상 재정의하는 메서드가 기본을 호출하지 않는지 확인해야합니다. 메소드

기본 클래스와 인터페이스를 사용하여 메소드를 노출하는 올바른 방법이 있습니까? 매우 둥근 것 같지만, 생각하는 모든면이 잘못되었다고 생각합니다 ...

질문이 명확하지 않으면 알려주세요. 아마도 바보 같은 질문 일 것입니다.하지만이 일을 올바르게하고 싶습니다.

EDIT : 훌륭한 추상 제안을 가진 모든 사람들에게 감사합니다. 그러나 이것은 디자이너를 해치 웁니다. abstract가 선택 가능하지 않은 옵션이라면 어떻게 할 것입니까?

+0

기본 클래스로 이동하여 NotImplemented 예외를 throw하기로 결정했습니다. 아마 최선의 디자인은 아니지만 모든 단일 파생 클래스에 많은 속성을 구현하지 않아도되고 누군가가이 메서드를 구현하는 것을 잊어 버리면 문제가됩니다. 만약 내가 대신 컴파일 오류로 만들 수 있다면. 의견을 보내 주셔서 감사합니다. 도움을 주실만한 다른 사람이있는 경우 댓글을 남겨주세요. –

+0

구성 요소가 특정 인터페이스를 구현하도록 요구할 수 있습니다. 삽입 가능한 UI 구성 요소를 추가 할 패널이 있다고 가정 해 보겠습니다. add 메서드는 플러그 가능한 컴포넌트 인터페이스, 즉 Plug1 : BaseControl, IPluggable {...}을 요구할 수 있습니다. void AddComponent (IPluggable componentToAdd) {...} –

+0

예. 이것은 원래 했었지만 구현해야하는 것을 피하기를 바랬습니다. 기본 클래스와 인터페이스 둘 다 멤버들에게 전화하기 위해 앞뒤로 전환해야만합니다 –

답변

5

또는 메소드를 구현할 때 클래스를 요구하지 않는 기본 클래스에서 메소드를 '추상'으로 정의 할 수 있습니다. 예를 들어 :

abstract class A 
{ 
    public abstract void B(); 
} 

은 물론이뿐만 아니라 추상적으로 당신의 기본 클래스를 강제하지만,이 당신을 위해 잘 작동하는 것처럼 들린다.

MSDN의 Abstract methods을 참조하십시오.

업데이트 abstract 이후

당신은 당신의 기본 클래스의 일부로 방법을 정의하고, 그것이에서 직접 호출되는 경우가 NotImplementedException을 던져 가질 수 인해 디자이너 문제에 당신을위한 옵션이 없습니다 기본 클래스 :

void DerivMethod() 
{ 
    // Must be implemented by derived class 
    throw new NotImplementedException(); 
} 

그렇지 않으면, interface를 사용하여 ... 위에서 입에 나쁜 맛 잎 특히, 잘 될 것

+1

거기에'override'가 무엇입니까? –

+1

추상 사용자 컨트롤을 만들 때는주의해야합니다. 이것은 실제로 디자이너에게 문제가 될 것입니다. 파생 된 사용자 정의 컨트롤을 수정하는 데 디자이너가 필요하지 않은 경우이 작업은 정상적으로 작동합니다. –

+0

Scott이 바로 이것에 대해, 저는 디자이너를 사용할 수 있어야합니다. 이렇게하면 그렇게 할 수 없습니다. 그러나 그것에 대해 다른 모든 위대한 작품,하지만이 이유는 내가 추상적으로 가지 않았어 –

1

마크 귀하의 기본 클래스에서 추상으로하는 방법. 파생 클래스에서이를 구현해야하지만 기본 클래스에는 메서드 정의가 필요하지 않습니다.

0

기본 클래스에서 함수 서명을 선언하고 "추상"수정자를 사용하십시오.

1

다른 사람들과 동의하지만 사용자 컨트롤 추상을 만드는 것은 디자이너에게 몇 가지 문제가 있습니다. 디자이너는 추상 사용자 컨트롤을 표시하지 않는 경우가 많습니다.

기본 클래스에 인터페이스 메소드를 구현했습니다. NotImplemented 예외 또는 Assert를 throw 할 수 있습니다.상속자가 이러한 메서드를 제대로 재정의하려면 메서드에서 실패하십시오.

관련 문제