2013-02-22 2 views
1

고급 수준에서 OOP 개념을 배우려고합니다. 나는 주제 인터페이스를 통해 읽고 혼란을 겪고 있었다. 그러나 먼저,이 혼란을 정확히 일으키는 원인을 보여 드리겠습니다.
나는 이것을 Code Sample으로 테스트했습니다. 하지만 인터페이스 사용과 혼동 스럽습니다. 이 코드를 구현 한 후에 클래스 A의 DoFirst 메소드를 간단히 인스턴스를 작성하여 호출 할 수 있습니다. 그렇다면 처음부터 인터페이스를 사용해야하는 이유는 무엇입니까? 이 같은OOP의 인터페이스 이해

뭔가 :

A myA = new A(); 
myA.DoFirst(); 

과와 비슷하게, 클래스 모두에서

B myB = new B(); 
myB.DoFirst(); 

, 내가 'DoFirst'라는 메소드를 구현, 그래서 무엇을 좋은 인터페이스는 나에게 제공되는 않는 한?

다른 클래스에서 직접 이러한 메서드를 작성할 수는 없습니까?

내 두 번째 질문은 다섯 가지 방법이있는 인터페이스가 있다고 가정 해 보겠습니다. 클래스가 그것을 구현해, 인터페이스가 제공하는 5 개의 메소드의 코드를 쓰는 대신에, 3 개의 메소드의 구현만을 제공하고 싶은 경우. 이것은 쓸모가 있지 않습니까? 왜 내가 원하지 않는 접근 방법이 있을까요?

누군가 예를 들어 답변 해 주실 수 있습니까? (높이 평가 해주세요)

+1

내가 중 하나를 참조하십시오 오히려 문은 반드시 각각의 최상위 수준에서 제대로 역할을 만드는 경우의 rediculously 많은 수 무엇을 쓰기보다는, 단지 다음과 같은 일을 할, 각 컨트롤의 인터페이스를 구현 인터페이스 구현의 이점은 객체 구현의 조롱을 통해 작성되지 않은 코드에 대한 단위 테스트 작성을 지원할 수 있다는 것입니다. 또한 팀 조정에 도움이되므로 X Y와 Z를 수행하는 객체를 만들 것이라고 예상하면 구현을 완료 할 때까지이 작업을 조롱 할 수 있습니다. 이렇게하면 작업을 마칠 때까지 작업을 계속할 수 있습니다. 또한 두 번째 경우에는 5 가지 방법과 3 가지 방법에 대해 서로 다른 인터페이스를 만들 것입니다. 몇 가지 방법을 생략해야하는 이유가 있어야할까요? – TheKingDave

+0

인터페이스를 사용하여 클래스가 모든 인터페이스 메소드를 구현하도록하십시오. – Sayse

+1

링크에서 첫 번째 답변을 살펴보십시오. 실제로 대답하는 내용은 –

답변

3

일부 실생활의 예 - 또한 다른 방법/인터페이스를 사용하는 이유.

내 코드에는 Excel에서 보고서를 생성하는 코드를 처리하는 엔진이 있습니다. 이 엔진에서는 코드를 두 가지 다른 방법으로 작성해야했습니다. 하나는 Microsoft Excel Interop을 사용하고 다른 하나는 Open Office Interop을 사용하는 것입니다. 두 가지 다른 방식으로 작동하도록 전체 엔진을 복제하거나 모든 실제 interop 함수에 많은 if 문을 작성하지 않고 인터페이스를 구현했습니다. 그런 다음 인터페이스를 구현하는 두 클래스를 선언했지만 Excel과 Excel을 사용하는 클래스를 각각 선언했습니다. 그런 다음, 내 코드에서 인터페이스 및 그 함수를 간단하게 참조하고 인터페이스의 구현을 시작할 인터페이스에 단일 if 문을 사용합니다.

public class ExcelEngineInterop : ISSinterface 
{ ... } 

public class OOEngineInterop : ISSinterface 
{ ... } 

//cant use two variables with the same name, so use 1 interface reference instead 
ISSinterface ssInt; 
if(ExcelFlag) 
    ssInt = new ExcelEngineInterop(); 
else 
    ssInt = new OOEngineInterop(); 

//two VERY different functions between Excel and OpenOffice. 
ssInt.OpenApp(); 
ssInt.OpenFile(fileName); 

//etc etc and so on 

인터페이스를 사용하는 또 다른 이유입니다. 어떤 외부 코드에 따라 두 가지 (또는 그 이상) 다른 방식으로 행동하기 위해 한 블록의 코드가 필요할 때.

또 다른 예.

사용자 정의 컨트롤이 많은 최상위 폼이 있습니다. 사용자는 버튼 클릭과 같은 양식 레벨 이벤트를 발생 시키지만 어떤 사용자 컨트롤이 활성 상태이고 어떤 시점에 클릭이 발생했는지에 따라 컨트롤 자체가 다른 작업을 수행해야합니다.

public ButtonClick(object sender, EventArgs e) 
{ 
    //note: I dont know which of my classes currentrightcontrol belongs to at the moment. 
    //  it could be any one of 22 different controls. It must be cast to something 
    //  in order to call the ButtonClick method (its actual type is generic "UserControl" 

    IMyRunControl ctrl = CurrentRightControl as IMyRunControl; 
    ctrl.FormButtonClicked(); 
} 
+0

위대한 설명 ... 그 의미가 –

+0

그것은 멋진 대답이지만, 다시 말하지만, 당신은 인터페이스를 사용하지 않고 두 클래스를 만들었습니다. 이제 플래그와 If 조건을 사용하면 동일한 결과를 얻을 수 있습니까? –

+0

사실, 당신 말이 맞아요. 만약 내가 그 길을 따라 가면 정말 어려울 것입니다. 당신은 그 예에서 옳습니다. if (ExcelFlag) ExcelEngineInterop ee = 새 ExcelEngineInterop(); else OOEngineInterop oo = new OOEngineInterop(); 그렇다면 다른 경우에는 CHECK가 필요합니다. ee == null && oo! = null then then this. 그리고이 수표는 오랫동안 갈 것입니다 ... 나는 그것을 올바르게 얻었 느냐 네빈? –

0

C#은 정적 유형 언어입니다 (적어도 명시 적으로 지정하지 않는 한). 즉, 컴파일러는 변수의 유형을 사용하여 참조 된 객체에 사용할 멤버가 있는지 여부를 확인합니다.

따라서 인터페이스는이 클래스가 해당 인터페이스를 구현한다는 것을 컴파일러 (및 다른 프로그래머에게도)에게 제공합니다. 계층 적 관계가없는 클래스에서 인터페이스를 공유 할 수 있으므로 매개 변수 유형에서 해당 인터페이스를 정의하여 개체를 인수로 사용할 수있는 메서드를 정의 할 수 있습니다.

+0

예를 들어 답을 뒷받침 할 수 있는지 이해하기가 더 쉬울 것입니다. –

3

는 장점은 이미 는 기본적으로 당신은 또한

void DoSomething(IMyInterface obj) 
{ 
    obj.DoFirst(); 
} 

을 쓴 후 매개 변수로 해당 인터페이스를 구현하는 객체의 모든 유형을 보낼 제공된 링크 ... 지적했다.

A myA = new A(); 
DoSomething(myA); 
B myB = new B(); 
DoSomething(myB); 

한이 IMyInterface라는 인터페이스를 공개로, 객체의 유형에 대해 상관하지 않는다 DoSomethig 방법.

+0

대답이 나에게 의미가 있습니다. 당신은 그렇게 간단하게했습니다. 덕분에 –