2012-02-28 10 views
1

Visual Studio에서는 인터페이스에 대해 명시 적으로 선언하지 않으면 메소드를 구현하지 않는다고 알려줍니다. 여기 내 방법은 다음과 같습니다명시 적으로 인터페이스 정의

List<Menu> IGetMenus.GetMyMenus() 
    { 
    } 

이유는 무엇입니까 :

여기
public interface IGetMenus 
{ 
    List<Menu> GetMyMenus(); 
    void InsertMenu(string topic, string subTopic); 
    void UpdateMainMenu(int menu_id, string topic); 
    void UpdateSubMenu(int menu_id, string topic); 
} 

인터페이스를 구현하기 위해 나를 원하는 방법 비주얼 스튜디오의 예입니다?

+0

클래스가 이미 클래스를 상속하거나 동일한 메소드 선언을 가진 다른 인터페이스 (IGetMenus가 아닌)를 구현합니까? –

+2

하지만 인터페이스를 구현하는 클래스는 어디에 있습니까? – vulkanino

+0

나는이 질문이 전에 존재했는지 몰랐다. 나는 명시 적으로 인터페이스를 구현해야하는 이유를 안다.하지만 같은 이름의 메소드를 가지고 있지 않다. 나는 그것을 얻었다. 감사합니다. 감사합니다. – BlackFire27

답변

4

보통 동일한 이름 + 매개 변수이지만 다른 반환 유형이있는 메소드가 있습니다.

C#에서는 유효하지 않습니다.이 경우 인터페이스를 구현하는 유일한 방법은 명시 적으로 수행하거나 다른 메소드를 이동하거나 이름을 바꾸는 것입니다.

2

좋은 예는 클래스가 전화하기를 원하는 방법입니다. 이것은 일반적으로 필요한 기능을 추가하지 않는 값 비싼 방법입니다.

ObjectCache이 좋은 예입니다. 암시 적 메서드를 사용하여 항목을 추가, 삭제 및 확인할 수 있습니다. 그러나 열거자는 명시 적으로 정의됩니다.

foreach(var item in (ObjectCache as Enumerator)) 
{ 
    ... 
} 

명시 적으로 캐시하지 않고 전체 캐시를 열거하지 마십시오.

+0

아주 좋은 예입니다. 다음 번엔 왜 명시 적 구현이 필요한지 묻습니다. 그러나이 경우 문제는 명시 적 구현을 ​​요구합니다. 대개 메소드 서명을 복제합니다. – ntziolis

0

명시 적으로 멤버를 구현할 때주의해야 할 중요한 점은 파생 클래스가 명시 적으로 구현 된 인터페이스 멤버를 부모 클래스에서 재정의 할 수 없으며 해당 멤버에 액세스 할 수 없으며 연결할 수없는 경우입니다 (if BaseClass이 명시 적으로 IFoo.Foo을 구현하는 경우 DerivedClass이 자체적으로 IFoo.Foo을 구현하는 유일한 방법이며, 파생 클래스가 그렇다면 IFoo.Foo은 파생 클래스의 메서드를 참조하므로 IFoo.Foo 구현에 액세스 할 수 없습니다. 부모 클래스). 결과적으로 파생 클래스 멤버가 상위 클래스 구현에 연결해야하는 경우 인터페이스 멤버 구현의 "내장"을 protected virtual 멤버에두고 해당 멤버를 명시 적으로 구현하는 것이 좋습니다. 인터페이스 멤버이므로 protected virtual을 호출합니다. 이렇게하면 파생 클래스가 해당 멤버와 체인을 재정의 할 수 있습니다.

관련 문제