Posso fazer uma classe (fixo) existente implementar uma nova interface?
-
06-07-2019 - |
Pergunta
Tenho a sensação de que já sei a resposta que as pessoas vão dar, mas aqui vai de qualquer maneira:
Say Eu estou escrevendo uma nova classe, vamos chamá-lo PooledQueue<T>
, no construtor da qual eu quiser aceitar um argumento que implementa a interface IResourcePool<T>
. A idéia aqui é que eu estou bem com o uso de qualquer objeto conjunto subjacente, desde que ele me dá as propriedades / métodos de IResourcePool<T>
(você sabe, a idéia por trás de interfaces, certo?).
Mas se há já uma classe disponível que fornece toda a funcionalidade de IResourcePool<T>
, exceto que ele não implementar IResourcePool<T>
(e eu não posso modificar o código fonte ), há alguma maneira de me forçar a implementação?
O que eu estou esperando que as pessoas resposta é que eu deveria fazer um wrapper para a classe existente que não implementar a interface necessária. Mas eu simplesmente preferem ser capaz de fazer isso:
// GetDataPool returns an object of type Pool<Data> that I can't modify
var q = new PooledQueue<Data>(GetDataPool());
em vez disso:
var q = new PooledQueue<Data>(new PoolWrapper<Data>(GetDataPool()));
Eu acho que o que eu sinto seria realmente útil é se a implementação de uma classe de uma interface pode ser definido separadamente da definição de classe. Classificar do caminho um banco de dados bem projetado é structued - com tabelas de associação que liga entidades com IDs de outras tabelas. Isso faz sentido?
Solução
Fora da caixa, você não pode forçar uma interface em uma classe sem herdar a partir dele.
Existem maneiras, como o uso de um transparente RealProxy ou 3-parte, como Linfu , que permitem para material de simulação como esta, mas a um custo mais elevado do que fazer a sua classe wrapper.
Na verdade, você poderia fazer um construtor sobrecarga que cria o wrapper para você, de modo que as estadias de código limpo ...