Überschreibt das Überschreiben das Open / Closed-Prinzip?

8

Das Open / Closed-Prinzip besagt, dass eine Klasse für die Erweiterung geöffnet, aber für die Änderung geschlossen sein sollte.

Ich dachte, dass der Modifikationsteil sich ausschließlich auf die Änderung des Quellcodes der Basisklasse bezieht. Aber ich hatte einen Streit mit jemandem, der sagte, dass dies auch Methoden von der Basisklasse überschreiben würde.

Ist diese Interpretation richtig?

    
conectionist 14.06.2016, 11:41
quelle

4 Antworten

3

Mit virtuellen Methoden kann das Verhalten einer Basisklasse in einer abgeleiteten Klasse ersetzt werden, ohne dass die Basisklasse geändert werden muss. Dies bedeutet, dass Sie das Open / Closed-Prinzip befolgen, da Sie das System erweitern können, ohne den vorhandenen Code ändern zu müssen. p>

Basisklassen (die nicht rein abstrakt sind) tendieren jedoch dazu, das Prinzip der Abhängigkeitsinversion zu verletzen, da die abgeleitete Klasse nimmt eine Abhängigkeit von der Basisklasse, die eine konkrete Komponente ist, anstatt eine Abstraktion zu sein. Denken Sie daran, dass die DIP Folgendes angibt:

  

High-level Module sollten [...] von Abstraktionen abhängig sein.

Außerdem tendieren Basisklassen dazu, das Interface-Trennprinzip zu verletzen, falls sie mehrere öffentliche (oder geschützte) definieren ) Methoden, die nicht alle vom abgeleiteten Typ verwendet werden. Dies ist eine Verletzung des ISP, weil:

  

kein Client sollte gezwungen sein, sich auf Methoden zu verlassen, die er nicht verwendet

    
Steven 14.06.2016 14:20
quelle
2

Ein Override ähnelt einem Callback, den jeder registrieren kann. Es ist wie:

%Vor%

In diesem Sinne gibt es keine Modifikation. Sie konfigurieren das Objekt nur neu, um den Rückruf aufzurufen, anstatt das Standardverhalten auszuführen.

Es ist genau wie das Klickereignis einer Schaltfläche. Sie würden nicht in Erwägung ziehen, eine Veranstaltung zu einer Änderung zu abonnieren. Es ist Erweiterung.

    
usr 14.06.2016 12:57
quelle
1

"Ich dachte, dass der Modifikationsteil sich ausschließlich auf den Quellcode der Basisklasse bezieht."

Sie dachten richtig .

Es gibt eine Vielzahl von Möglichkeiten, um eine Klasse erweiterbar zu machen und zu erlauben, dass eine davon erbt. Das Schlüsselwort extend wird sogar in einigen Sprachen verwendet, um die Vererbung zu aktivieren, was es ziemlich offensichtlich macht, dass wir nicht modifizieren, wir erweitern ...

Ob Vererbung die richtige Lösung für die Erweiterbarkeit ist oder nicht, ist ein anderes Problem, aber normalerweise nicht. Die Zusammensetzung sollte der bevorzugte Weg sein, um Klassen erweiterbar zu machen (z. B. Strategie, Beobachter, Dekorateur, Pfeifen und Filter usw.).

    
plalx 14.06.2016 13:36
quelle
0

Formular "Adaptive Code via C #" Buch, virtuelle Methoden ist ein Instrument, um OCP zu erreichen.

    
zzfima 28.02.2018 06:26
quelle