Ich bin gerade dabei, C # zu beherrschen, also lese ich Adaptive Code über C # von Gary McLean Hall .
Er schreibt über Muster und Anti-Muster. In dem Teil Implementierungen versus Schnittstellen schreibt er Folgendes:
Entwickler, die mit dem Konzept der Programmierung von Schnittstellen noch nicht vertraut sind, haben häufig Schwierigkeiten, die Hintergründe der Schnittstelle loszulassen.
Zum Zeitpunkt der Kompilierung sollte jeder Client einer Schnittstelle keine Ahnung haben, welche Implementierung der Schnittstelle er verwendet. Dieses Wissen kann zu falschen Annahmen führen, die den Client an eine bestimmte Implementierung der Schnittstelle koppeln.
Stellen Sie sich das allgemeine Beispiel vor, in dem eine Klasse einen Datensatz in einem dauerhaften Speicher speichern muss. Zu diesem Zweck delegiert es zu Recht an eine Schnittstelle, die die Details des verwendeten dauerhaften Speichermechanismus verbirgt. Es wäre jedoch nicht richtig, Annahmen darüber zu treffen, welche Implementierung der Schnittstelle zur Laufzeit verwendet wird. Das Umwandeln des Schnittstellenverweises in eine Implementierung ist beispielsweise immer eine schlechte Idee.
Es mag die Sprachbarriere sein oder mein Mangel an Erfahrung, aber ich verstehe nicht ganz, was das bedeutet. Folgendes verstehe ich:
Ich habe ein Freizeit-Spaßprojekt, um C # zu üben. Dort habe ich eine Klasse:
public class SomeClass...
Diese Klasse wird an vielen Orten verwendet. Während ich C # lernte, las ich, dass es besser ist, mit einer Schnittstelle zu abstrahieren, also habe ich Folgendes gemacht
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.
Also habe ich alle Klassenreferenzen durch ISomeClass ersetzt.
Außer in der Konstruktion, wo ich schrieb:
ISomeClass myClass = new SomeClass();
Verstehe ich richtig, dass dies falsch ist? Wenn ja, warum und was soll ich stattdessen tun?
ISomeClass myClass = new SomeClass();
? Wenn du das wirklich meinst, ist das Rekursion im Konstruktor, wahrscheinlich nicht das, was du willst ?
ISomeClass
), aber es ist auch einfach, zu allgemeine Schnittstellen zu erstellen, für die es unmöglich ist , nützlichen Code zu schreiben sind die Schnittstelle zu überdenken und den Code umzuschreiben oder zu downcasten.