Imagine uma situação em que estamos usando uma biblioteca que permite criar Circle
objetos, onde você pode especificar o raio e o centro do círculo para defini-lo. No entanto, por algum motivo, também é necessário um flavour
parâmetro necessário . Agora, digamos que eu realmente precise usar Circle
no meu próprio aplicativo, mas para os fins do meu aplicativo, posso definir o sabor Flavours.Cardboard
sempre.
Para "resolver" isso, eu crio minha própria Circle
classe em um espaço para nome diferente, que apenas aceita radius
e center
como parâmetros, mas possui um conversor implícito na Circle
classe da biblioteca externa que apenas cria um Circle(this.radius, this.center, Flavours.Cardboard)
objeto. Então, em todo lugar que eu preciso do outro tipo Circle
, deixo a conversão automática ocorrer.
Quais são as conseqüências da criação dessa classe? Existem soluções melhores? Faria alguma diferença se meu aplicativo fosse uma API construída sobre essa biblioteca externa, destinada ao uso por outros programadores?
fonte
MakeCircle
função ?makePlayer
que apenas aceita cabos para colocar o jogador, mas delega para um construtor muito mais complexo.Respostas:
Embora nem sempre seja ruim, é muito raro que as conversões implícitas sejam sua melhor opção.
Existem problemas.
Em geral, existem melhores soluções.
Pessoalmente, acho o número 2 o mais simples de implementar e o menos oneroso no design. Os outros podem ficar bem, dada a situação e o que mais você está tentando fazer com essas classes.
A conversão implícita é o último recurso, e só me parece realmente valer a pena quando tenho functors no estilo C ++ que estou tentando criar - objetos de estratégia que eu implicitamente converto para delegar tipos.
fonte
Dado o cenário que você está descrevendo, você pode pensar nisso em termos de aplicação parcial da função.
Um construtor é uma função (pelo menos em teoria; em C #, você pode criar uma "função de fábrica" que chama o construtor):
para aplicação parcial, o seguinte será suficiente:
Agora você pode obter seu construtor que requer apenas 2 parâmetros:
Então agora você tem uma função de fábrica com os parâmetros desejados
BTW, isso é claramente equivalente à opção 2 acima, apenas de uma perspectiva mais funcional.
fonte