У меня такое чувство, что я уже знаю ответ, который люди дадут, но все равно так и будет:
Скажем, я пишу новый класс, назовем его 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()));
Я думаю, что было бы полезно, если бы реализация интерфейса класса могла быть определена отдельно от определения класса. В некотором роде структурирована хорошо спроектированная база данных - таблицы ассоциаций связывают сущности с идентификаторами из других таблиц. Это имеет смысл?