Я в настоящее время в процессе попытки мастер C #, так что я читаю адаптивный код через C # по Gary McLean Hall .
Он пишет о шаблонах и анти-шаблонах. В части реализации и интерфейсов он пишет следующее:
Разработчики, которые плохо знакомы с концепцией программирования интерфейсов, часто испытывают трудности с тем, чтобы оставить то, что находится за интерфейсом.
Во время компиляции любой клиент интерфейса не должен знать, какую реализацию интерфейса он использует. Такое знание может привести к неверным предположениям, которые связывают клиента с конкретной реализацией интерфейса.
Представьте себе общий пример, в котором класс должен сохранять запись в постоянном хранилище. Для этого он по праву делегирует интерфейс, который скрывает детали используемого механизма постоянного хранения. Однако было бы неправильно делать какие-либо предположения о том, какая реализация интерфейса используется во время выполнения. Например, приведение ссылки на интерфейс к любой реализации всегда плохая идея.
Это может быть языковой барьер или отсутствие у меня опыта, но я не совсем понимаю, что это значит. Вот что я понимаю:
У меня есть свободное время для веселого проекта на C #. Там у меня есть класс:
public class SomeClass...
Этот класс используется во многих местах. Во время изучения C # я прочитал, что лучше абстрагироваться с помощью интерфейса, поэтому я сделал следующее
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.
Поэтому я вошел во все некоторые ссылки на классы и заменил их на ISomeClass.
За исключением строительства, где я написал:
ISomeClass myClass = new SomeClass();
Я правильно понимаю, что это неправильно? Если да, то почему, и что я должен делать вместо этого?
ISomeClass myClass = new SomeClass();
? Если вы действительно это имеете в виду, это рекурсия в конструкторе, возможно, не то, что вы хотите. Надеюсь, вы имеете в виду« конструирование », т.е. распределение, возможно, но не в самом конструкторе, верно ?
ISomeClass
), но также легко сделать слишком общие интерфейсы, для которых невозможно написать полезный код, для которого на данный момент единственные варианты должны переосмыслить интерфейс и переписать код или убрать.