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á 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?

Foi útil?

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 ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top