Die Verwendung ist in beiden Fällen einfach, aber was bedeutet es, die Parametereingabe in Parser1 im Vergleich zu den anderen zu aktivieren?
Es ist eine grundlegende Designänderung. Und Design sollte Absicht und Bedeutung vermitteln. Benötigen Sie separate Objekte für jede Zeichenfolge, die Sie analysieren möchten? Mit anderen Worten, warum benötigen wir eine Parserinstanz mit stringX und eine andere Instanz mit stringY? Was ist mit dem Parsen (ing) und der gegebenen Zeichenfolge, dass die beiden zusammen leben und sterben müssen? Unter der Annahme, dass sich die "zugrunde liegende [Parsing] -Implementierung" (wie Robert Harvey sagt) nicht ändert, scheint es keinen Sinn zu machen. Und selbst dann ist es meiner Meinung nach fraglich.
Wie ändert sich das Konzept einer Klasse, wenn Daten anstelle von Methodenparametern an den Konstruktor übergeben werden?
Konstruktorparameter sagen mir, dass diese Dinge für ein Objekt erforderlich sind. Der richtige Zustand ist ohne sie nicht garantiert. Außerdem weiß ich, wie / warum sich ein Parser grundlegend von einem anderen unterscheidet.
Konstruktorparameter verhindern, dass ich zu viel über die Verwendung der Klasse wissen muss. Wenn ich stattdessen bestimmte Eigenschaften festlegen soll - woher weiß ich das? Eine ganze Dose Würmer öffnet sich. Welche Eigenschaften? In welcher Reihenfolge? Bevor ich welche Methoden verwende? und so weiter.
Eine andere Frage taucht auf, wenn mir klar wird, dass eine Schnittstelle in der zweiten Implementierung ziemlich bedeutungslos wäre:
Eine Schnittstelle wie in der API sind die Methoden und Eigenschaften, die dem Clientcode ausgesetzt sind. Lassen Sie sich nicht public interface { ... }
ausschließlich einwickeln . Die Bedeutung der Schnittstelle liegt also im Entweder-Oder-Konstruktor-gegen-Methodenparameter-Dilemma, NICHT im public interface Iparser
vspublic sealed class Parser
Die sealed
Klasse ist seltsam. Wenn ich über verschiedene Parser-Implementierungen nachdenke - Sie haben "Iparser" erwähnt -, ist die Vererbung mein erster Gedanke. Es ist nur eine natürliche konzeptionelle Erweiterung in meinem Denken. IE alle ParserX
s sind grundsätzlich Parser
s. Wie soll ich es sonst sagen? ... Ein deutscher Schäferhund ist ein Hund (Erbschaft), aber ich kann meinen Papagei zum Bellen ausbilden (benimm dich wie ein Hund - "Schnittstelle"); aber Polly ist kein Hund, der nur so tut, als hätte er eine Untergruppe von Hunden gelernt. Abstrakte oder andere Klassen dienen perfekt als Schnittstellen .