2012-07-06 2 views
3

메서드/속성 정의가 제 3 자 (또는 기본) 클래스에 정의 된 메서드/속성 중 일부와 이미 일치하는 인터페이스 (예 : MyClass Implements MyInterface)를 정의 할 수 있습니까?VB.NET에서 소급 적으로 인터페이스를 구현할 수 있습니까?

예를 들어, DataRow 클래스에는 "행과 유사한"여러 가지 속성/메서드가 있습니다. 네이티브 DataRow 클래스에 이미 존재하는 특정 메서드와 속성을 정의하는 인터페이스 (즉, IRowLike)를 구현하려는 경우 (직접 터치하거나 확장 할 수 없음) 간단히 클래스가 런타임에 실제로 인터페이스를 준수한다는 점을 동의하기 만하면됩니다.

인터페이스는 가난한 사람의 "오리 타이핑"버전을 제공합니다. 주어진 인터페이스를 모두 준수하는 클래스 세트를 얻은 후에는 해당 인터페이스에 대한 확장 메서드를 정의 할 수 있으며 인터페이스를 지원하는 모든 클래스는 즉시 새로운 동작을 얻습니다. 소급 클래스에 대해 인터페이스를 소급 적용하려는 것이 이상하게 보일 수도 있지만 적은 코드로 더 많은 작업을 수행 할 수 있습니다.

답변

2

.Net에서는 가능하지 않습니다. 유형은 컴파일 타임에 메타 데이터에서 구현하는 인터페이스를 정의하며 런타임에 해당 정의를 변경할 수 없습니다. 특정 인터페이스를 구현하지만 기존 유형을 변경하지 않는 유형을 런타임에 생성 할 수 있습니다.

몇 가지 대안이 있습니다. VB.Net에서는 타입에 늦은 바인딩을 사용하도록 선택하고 그런 식으로 인터페이스 메소드에 액세스 할 수 있습니다. (C#에서는 dynamic) 물론 코드는 정적으로 검증 할 수 없습니다.

+0

우리 가게에서는 정적 바인딩이 필요합니다. 정보를 주셔서 감사합니다. :) – Mario

+0

재미있는 점은 기존 유형이 실제로 변경되지 않는다는 것입니다. 우리가하는 일은이 유형이이 인터페이스와 일치한다는 것입니다. 실제로는 그 타입의 구현을 1 비트 변경하지 않습니다. – Mario

+2

안타깝게도 클래스를 소급하여 인터페이스에 가입하게 만들 수 없기 때문에 모든 유형에 대해 동일한 확장 메서드의 변형을 코딩 할 수 있습니다. 이것을 여러 유형의 호스트 (우리의 경우 사용자 컨트롤)에 적합한 3 가지 또는 4 가지 다른 방법과 곱하면 같은 논리를 반복해서 쓰게됩니다. 클래스가 소급 적으로 인터페이스와 일치하도록 만들 수 있다면이 반복은 모두 제거 될 수 있습니다. 인터페이스 란 무엇인가? 계약이란 무엇입니까? – Mario

관련 문제