2010-12-07 6 views
0

그래서 전체 "프로그래밍 인터페이스"방법론을 고수하고 인터페이스를 사용하여 Windows Forms 응용 프로그램에서 몇 가지 별도의 동작을 구성하려고했습니다.인터페이스를 사용하여 상속을 구조화하는 데 도움이 필요합니까?

는 기본적으로, 나는 내가 아래로 전파 할 IActions에 실행() 메소드를하고 싶었이

        IActions 
       |----------------------------------------| 
     IValidateAction       IExecuteAction 
    |----------------------|    |----------------------| 
IIis6Validate   IIis7Validate IIis6Actions   IIis7Actions 
          |          | 
       |--------------------|     |---------------------| 
     ValidateWebCreation      CreateWebsite 

같은 고장 구조를 가지고있다. 기본 추상 클래스를 사용하여이 작업을 수행 할 수 있음을 알고 있지만 인터페이스에 대한 프로그램 방법을 따르기를 원했기 때문에 언제든지 객체가 다른 객체를받을 수 있도록 (인터페이스) 인스턴스를 주입하는 아이디어를 좋아했습니다. 동일한 기본 인터페이스에서 상속 된 객체만큼 오래.

하지만 클래스에서 인터페이스를 상속받을 때 적용되는 계약이 다른 인터페이스에서 상속 된 인터페이스를 따르지 않는 것으로 나타났습니다. InterfaceB는 InterfaceA와 상호 교환이 가능한 한 다른 게시물을 읽었습니다. 여기에 적용됩니까?

이 트리를 사용할 수 있습니까? 클래스 상속을 사용하거나이 트리를 별도의 트리 구조로 분리해야합니까?

당신이

interface IA 
{ 
    void A(); 
} 

interface IB : IA 
{ 
    void B(); 
} 

IB를 구현하는 클래스는 AB 모두 구현해야하는 경우 : 다른 인터페이스에서 상속 인터페이스 소개

+2

FYI의 "프로그래밍 인터페이스"는 우리가 현대 프로그래밍 언어에서 알고있는 것처럼 인터페이스를 의미하지는 않습니다. "인터페이스"는 클래스의 공용 메서드 및 속성입니다. 인터페이스 프로그래밍은 일반적으로 클래스 계층 구조를 의미하고이를 사용하는 코드에서 특정 구체적인 클래스가 아닌 인터페이스하도록 프로그래밍합니다. 즉, 정의한 변수는 기본 클래스의 유형이고 차가운 인스턴스는 하위 클래스 중 하나가됩니다 (따라서 다형성을 가능하게합니다). –

+0

인터페이스 및 계약과 관련하여 http://blogs.msdn.com/b/kcwalina/archive/2004/10/24/246947.aspx –

답변

3

. 선언문은 IA에서 명시 적으로 반복되므로 IB에 명시 적으로 반복 할 필요가 없습니다. IB은 어쨌든 IA에서부터 모든 것을 요구합니다.

인터페이스 계층을 사용하는 데 문제가 없습니다.

마찬가지로 일부 인터페이스 또는 모든 인터페이스에 대해 해당 인터페이스를 구현하는 병렬 추상 클래스 계층을 만들 수 있습니다. 일부 메소드의 선언뿐만 아니라 구현을 공유하려는 경우 적합합니다.

0

이것은 상당히 복잡한 인터페이스 구조처럼 보입니다. 여기서 정의하는 각 인터페이스가 실제로 본질적으로 의미 있고 유용하다고 확신합니까? 낮은 수준의 인터페이스에서 그런 정도의 특이성을 필요로하며, 더 높은 수준의 인터페이스가 유용 할만큼 구체적입니까?

다른 인터페이스를 확장하는 인터페이스가 클래스와 동일한 "계약 시행"을 초래하지 않는다고 말할 때 어떤 내용을 말하는지 잘 모르겠습니다. 인터페이스는 아무 것도 구현하지 않으므로 한 인터페이스를 다른 인터페이스에서 파생하는 경우 클래스를 구현하여 구현해야하는 계약을 확장하는 것입니다. 부모 인터페이스의 멤버는, 아이 인터페이스에 의해 지정된 계약에 암묵적으로 포함됩니다. 예를 들어 : BA에서 Foo을 "상속"이후

interface A 
{ 
    void Foo(); 
} 

interface B 
{ 
    void Bar(); 
} 

class C : B 
{ 
    void Foo(); 
    void Bar(); 
} 

클래스 CFooBar 모두를 구현해야합니다.

명시 적 인터페이스 구현을 살펴볼 수도 있습니다. herehere을 참조하십시오.

업데이트 : 특정 구현에서 메소드가 다른 매개 변수를 사용하는 경우 인터페이스 구조를 다시 생각해 봐야합니다. 한 걸음 물러서서 IAction이 나타내는 것과 클라이언트 코드가 어떻게 사용하는지 생각해보십시오. IAction의 구체적인 유도체 파라미터를 구체적 Execute(...) 방법을 정의하는 예를 들어

IAction 매개 변수없이 일반적인 방법을 정의 Execute() 가정한다.

무엇을 사용하면 "일반"Execute() 방법입니까? 각 특정 구현은 실제로 메서드의 매개 변수 형태로 추가 정보를 필요로하므로 매개 변수가없는 Execute()은 정확히 무엇을해야합니까?

+0

을 살펴 보시기 바랍니다. 다소 복잡 할 수 있습니다. 나는 프로그래밍에 익숙하지 않은/C# 그래서 내가 왜 약간의 피드백을 위해 여기를 돌리고 있었는지. 아마 어쩌면 축소해야합니까? – pghtech

+0

IIs6WebsiteValidation : IIisValidation – pghtech

+0

추상 클래스 및/또는 가상 메서드를 통해 사용하여 다양한 변형을 구현할 수 있습니까? 따라서 계층 구조의 맨 위에 Execute 메서드가 있지만 클래스 수준이나 기본 클래스에서는 Execute 메서드가 다른 매개 변수를 사용할 수 있습니다. – pghtech

관련 문제