Могу ли я заставить существующий (фиксированный) класс реализовать новый интерфейс?

StackOverflow https://stackoverflow.com/questions/1632970

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

Есть способы, такие как использование прозрачного RealProxy или сторонние библиотеки, такие как LinFU , которые позволяют вам чтобы имитировать подобные вещи, но по более высокой цене, чем создание класса-оболочки.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top