This question 및 Eric Lippert's answer 궁금한 점이 있습니까? 인터페이스의 메소드를 구현할 때 명시 적 또는 암시 적 구현을 사용할지 여부를 결정하는 방법은 무엇입니까?인터페이스 멤버를 명시 적으로 또는 암시 적으로 구현해야합니까?
8
A
답변
8
(개인적으로) 동일한 서명이있는 메소드간에 충돌이있을 때만 명시 적 구현이 필요합니다.
예를 들어 IEnumerable<T>
을 구현할 때 반환 유형을 제외하고 동일한 서명을 갖는 두 개의 메소드 GetEnumerator()
을 구현해야합니다. 그래서 당신은 명시 적으로 IEnumerable.GetEnumerator()
를 구현해야합니다 : 당신이 방법 만의 인터페이스를 통해, 개체 인스턴스를 호출하지 않으려면
public abstract class MyClass<T> : IEnumerable<T>
{
public IEnumerator<T> GetEnumerator()
{
return ...;
}
IEnumerator IEnumerable.GetEnumerator() // explicit implementation required
{
return GetEnumerator();
}
}
명시 적 구현을위한 또 다른 용도가있다. 나는 개인적으로 이것이별로 의미가 없다고 생각하지만 아주 드물게는 유용 할 수 있습니다.
3
필립의 대답은 실용적이지만, 건축 학적 고려 사항도 있습니다.
인터페이스는 다른 개체에서 사용할 수 있도록 클래스를 호환 가능하게 만드는 데 사용됩니다. 객체를 소비하는 객체 만 인터페이스의 기능을 필요로하는 경우 최소 권한의 원칙에 따라 객체를 제한해야합니다. 해당 인터페이스 메소드를 클래스의 다른 모든 사용자에게 노출하는 것은 불필요합니다. 객체가 내부 개체에서 호출을 수락 할 수있는 인터페이스를 구현해야하지만 당신은 당신의 API의 일부로 사람들을 노출하지 않으려는 경우
폴
1
명시 적 인터페이스에 대한 또 다른 경우이다.
관련 문제
- 1. 명시 적으로 소멸자를 호출해야합니다.
- 2. AppEngine '명시 적으로 취소됨'오류
- 3. C++ 명시 적으로 생성자와
- 4. 명시 적으로 스레드를 완료하여
- 5. 명시 적으로 SVN
- 6. 파생 클래스에서 명시 적으로 구현 된 인터페이스 메서드를 재정의하십시오.
- 7. 명시 적으로 C++ 클래스 멤버를 초기화하지 않으면 어떻게 초기화됩니까?
- 8. 어셈블리를 명시 적으로 지정 하시겠습니까?
- 9. 암시 적으로 변환 형 문제
- 10. 이 스칼라 메서드를 명시 적으로 호출하면 암시 적으로 해결 될 수 있습니까?
- 11. 명시 적으로 malloc()의 반환 값을 캐스팅해야합니까?
- 12. routes.rb 명시 적으로 템플릿을 선택하십시오.
- 13. 메서드의 docstring을 명시 적으로 설정합니다.
- 14. 어떻게 명시 적으로 ItemsCollection.Filter를 호출합니까?
- 15. document.domain이 명시 적으로 설정되었는지 테스트
- 16. auto_ptr 초기화를 명시 적으로 제로화해야합니까?
- 17. const 멤버는 명시 적으로 초기화하지만
- 18. applicationname = "/"명시 적으로 지정 했더라도?
- 19. 명시 적으로 항목을 구조체에 저장합니다.
- 20. setResult를 RESULT_CANCELED로 명시 적으로 설정해야합니까?
- 21. Close가 명시 적으로 호출되지 않았습니다.
- 22. 는 할 수는 조건 연산자는 암시 적으로 ...
- 23. C# 암시 적으로 사용자 정의 SecurityPrincipal을 스레드
- 24. 명시 적으로 구현 된 인터페이스 및 제네릭 제약
- 25. 암시 적으로 형식을 변환 할 수 없습니다
- 26. 명시 적으로 설정되지 않은 변수의 값은 무엇입니까?
- 27. 서블릿이 doGet/doPost의 끝에서 명시 적으로 반환되어야합니까?
- 28. 왜 Float/Double에서 BigDecimal로 암시 적으로 변환 되나 String에서는 암시 적으로 변환되지 않습니까?
- 29. Request.Form을 명시 적으로 수행하는 대신 Request.Params를 사용해야합니까?
- 30. 창 언로드시 JavaScript 객체를 명시 적으로 제거해야합니까?
이것이 적용되는 예를 생각해 볼 수 있습니까? – jasonh
웹 개발. 클래스가 웹에서 서비스를 제공하도록 설계된 경우 보안 인터페이스에서 신원 확인을 수행하는 방법이있을 수 있으며 다른 상황에서는 사용할 수 없습니다 (로컬). 이것은 내가 종종 무시한다고 생각하는 C# 기능을 약간 알고 있습니다. 거기에 다른 예제가 있습니까? – Paul