Могу ли я заставить существующий (фиксированный) класс реализовать новый интерфейс? - PullRequest
2 голосов
/ 27 октября 2009

У меня такое чувство, что я уже знаю ответ, который люди дадут, но все равно так и будет:

Скажем, я пишу новый класс, назовем его 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()));

Я думаю, что было бы полезно, если бы реализация интерфейса класса могла быть определена отдельно от определения класса. В некотором роде структурирована хорошо спроектированная база данных - таблицы ассоциаций связывают сущности с идентификаторами из других таблиц. Это имеет смысл?

1 Ответ

2 голосов
/ 27 октября 2009

Из коробки нельзя принудительно настроить интерфейс для класса, не наследуя его.

Существуют способы, такие как использование прозрачных RealProxy или сторонних библиотек, таких как LinFU , которые позволяют моделировать подобные вещи, но с более высокой стоимостью, чем создание ваш класс обёртки.

На самом деле, вы можете создать конструктор перегрузки, который создаст для вас оболочку, чтобы код оставался чистым ...

...