문제

나는 사람들이 줄 대답을 이미 알고있는 느낌이 들지만, 여기서 간다 :

내가 새로운 수업을 쓰고 있다고 말하면, 그것을 부르자 PooledQueue<T>, 제작자에서 인터페이스를 구현하는 인수를 받아들이고 싶습니다. IResourcePool<T>. 여기서 아이디어는 저에게 속성/방법을 제공하는 한 기본 수영장 객체를 사용하는 것이 좋습니다. IResourcePool<T> (인터페이스 뒤에있는 전체 아이디어가 맞습니까?).

그러나 있다면 이미 모든 기능을 제공하는 클래스 IResourcePool<T>, 그렇지 않은 것을 제외하고 구현하다 IResourcePool<T> (그리고 소스 코드를 수정할 수 없습니다), 구현을 강요 할 수있는 방법이 있습니까?

사람들이 대답하기를 기대하는 것은 필요한 인터페이스를 구현하는 기존 클래스를위한 래퍼를 만들어야한다는 것입니다. 그러나 나는 단지 이것을 할 수있는 것을 선호합니다.

// GetDataPool returns an object of type Pool<Data> that I can't modify
var q = new PooledQueue<Data>(GetDataPool());

대신 :

var q = new PooledQueue<Data>(new PoolWrapper<Data>(GetDataPool()));

클래스의 인터페이스 구현이 클래스 정의와 별도로 정의 될 수 있는지 여부는 내가 정말로 유용 할 것이라고 생각합니다. 다른 테이블의 ID와 엔티티를 연결하는 협회 테이블과 함께 잘 설계된 데이터베이스가 구조화되는 방식입니다. 말이 돼?

도움이 되었습니까?

해결책

상자 밖에서, 당신은 그것을 상속하지 않고도 클래스의 인터페이스를 강제로 강제 할 수 없습니다.

투명한 사용과 같은 방법이 있습니다 RealProxy 또는 3 자 라이브러리와 같은 Linfu, 이와 같은 물건을 시뮬레이션 할 수 있지만 래퍼 클래스를 만드는 것보다 더 높은 비용으로.

실제로, 당신은 코드가 깨끗하게 유지되도록 래퍼를 생성하는 과부하 생성자를 만들 수 있습니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top