Jestem aktualnie w procesie próbują opanować C #, więc czytam kod adaptacyjnego poprzez C # przez Gary McLean Hall .
Pisze o wzorach i anty-wzorach. W części Implementacje kontra interfejsy pisze:
Deweloperzy, którzy są nowi w koncepcji programowania interfejsów, często mają trudności z odpuszczeniem tego, co kryje się za interfejsem.
W czasie kompilacji każdy klient interfejsu nie powinien mieć pojęcia, jakiej implementacji interfejsu używa. Taka wiedza może prowadzić do błędnych założeń, które łączą klienta z konkretną implementacją interfejsu.
Wyobraź sobie powszechny przykład, w którym klasa musi zapisać rekord w trwałym magazynie. Aby to zrobić, słusznie deleguje do interfejsu, który ukrywa szczegóły stosowanego mechanizmu trwałego przechowywania. Jednak niewłaściwe byłoby przyjmowanie jakichkolwiek założeń dotyczących tego, która implementacja interfejsu jest używana w czasie wykonywania. Na przykład rzutowanie odwołania interfejsu do dowolnej implementacji jest zawsze złym pomysłem.
Może to być bariera językowa lub brak doświadczenia, ale nie do końca rozumiem, co to oznacza. Oto co rozumiem:
Mam projekt zabawy w wolnym czasie, aby ćwiczyć C #. Tam mam zajęcia:
public class SomeClass...
Ta klasa jest używana w wielu miejscach. Podczas nauki języka C # przeczytałem, że lepiej jest abstrakcji za pomocą interfejsu, więc zrobiłem następujące
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.
Więc przejrzałem wszystkie odniesienia do klas i zastąpiłem je ISomeClass.
Z wyjątkiem konstrukcji, w której napisałem:
ISomeClass myClass = new SomeClass();
Czy dobrze rozumiem, że to źle? Jeśli tak, dlaczego tak i co powinienem zrobić zamiast tego?
ISomeClass myClass = new SomeClass();
? Jeśli tak naprawdę masz na myśli, to jest to rekurencja w konstruktorze, prawdopodobnie nie to, czego chcesz. Mam nadzieję, że masz na myśli w„ konstrukcji ”, to znaczy alokacji, ale nie w samym konstruktorze, prawda ?
ISomeClass
), ale łatwo jest także tworzyć zbyt ogólne interfejsy, dla których nie można napisać przydatnego kodu, na którym to etapie jedyne opcje są na nowo przemyśleć interfejs i przepisać kod lub obniżyć.