Atualmente, estou tentando dominar o C #, então estou lendo o Adaptive Code via C # de Gary McLean Hall .
Ele escreve sobre padrões e antipadrões. Na parte implementações versus interfaces, ele escreve o seguinte:
Os desenvolvedores que são novos no conceito de programação para interfaces geralmente têm dificuldade em deixar de lado o que está por trás da interface.
Em tempo de compilação, qualquer cliente de uma interface não deve ter idéia de qual implementação da interface está usando. Esse conhecimento pode levar a suposições incorretas que associam o cliente a uma implementação específica da interface.
Imagine o exemplo comum em que uma classe precisa salvar um registro no armazenamento persistente. Para fazer isso, ele delega corretamente a uma interface, que oculta os detalhes do mecanismo de armazenamento persistente usado. No entanto, não seria correto fazer suposições sobre qual implementação da interface está sendo usada em tempo de execução. Por exemplo, converter a referência de interface para qualquer implementação é sempre uma má ideia.
Pode ser a barreira do idioma ou a minha falta de experiência, mas não entendo direito o que isso significa. Aqui está o que eu entendo:
Eu tenho um projeto divertido de tempo livre para praticar C #. Lá eu tenho uma aula:
public class SomeClass...
Esta classe é usada em muitos lugares. Ao aprender C #, li que é melhor abstrair com uma interface, então fiz o seguinte
public interface ISomeClass <- Here I made a "contract" of all the public methods and properties SomeClass needs to have.
public class SomeClass : ISomeClass <- Same as before. All implementation here.
Então, eu entrei em todas as referências de classe e as substitui pelo ISomeClass.
Exceto na construção, onde escrevi:
ISomeClass myClass = new SomeClass();
Estou entendendo corretamente que isso está errado? Se sim, por que sim e o que devo fazer?
ISomeClass myClass = new SomeClass();
? Se você realmente quer dizer isso, isso é recursão no construtor, provavelmente não é o que você deseja. Espero que você queira dizer em" construção ", ou seja, alocação, talvez, mas não no próprio construtor, certo ?
ISomeClass
), mas também é fácil criar interfaces muito genéricas para as quais é impossível escrever código útil e nesse momento as únicas opções são repensar a interface e reescrever o código ou fazer downcast.