Derzeit habe ich zwei abgeleitete Klassen, A
und B
beide haben ein gemeinsames Feld, und ich versuche zu bestimmen, ob es in die Basisklasse aufgenommen werden soll.
Es wird nie von der Basisklasse aus referenziert, und sagen Sie, wenn irgendwann auf der Straße eine andere Klasse abgeleitet wird C
, die kein a hat _field1
, dann würde das Prinzip der "am wenigsten privilegierten" (oder etwas) nicht verletzt, wenn dies der Fall ist war?
public abstract class Base
{
// Should _field1 be brought up to Base?
//protected int Field1 { get; set; }
}
public class A : Base
{
private int _field1;
}
public class B : Base
{
private int _field1;
}
public class C : Base
{
// Doesn't have/reference _field1
}
Base
,A
,B
,C
, und_field1
sind. Das sind wichtige Details, die man nicht auslassen sollte; Ich denke, Sie sollten die Frage bearbeiten, um darüber zu sprechen, was das ist.Antworten:
Es hängt alles von dem genauen Problem ab, das Sie zu lösen versuchen.
Betrachten Sie ein konkretes Beispiel: Ihre abstrakte Basisklasse ist
Vehicle
und Sie haben derzeit die konkreten ImplementierungenBicycle
undCar
. Sie erwägen,numberOfWheels
vonBicycle
undCar
zu einem Fahrzeug zu wechseln. Solltest du das tun? Nein! Weil nicht alle Fahrzeuge Räder haben. Wenn Sie versuchen, eineBoat
Klasse hinzuzufügen, können Sie bereits erkennen, dass sie sich auflösen wird.Wenn es sich bei Ihrer abstrakten Basisklasse um eine abstrakte Basisklasse handelte,
WheeledVehicle
ist es logisch, dienumberOfWheels
Elementvariable dort zu haben.Sie müssen die gleiche Logik auf Ihr Problem anwenden, da dies, wie Sie sehen, keine einfache Ja- oder Nein-Antwort ist.
quelle
roll()
Methode hinzufügen , bei der die Idee der Unterklasse vorausschauend ist.Logischerweise gibt es neben der Platzierung des Feldes, das in Unterklassen repliziert wurde, in der Basisklasse eine dritte Option: eine neue Unterklasse in die Hierarchie einzuführen, die die gemeinsamen Eigenschaften zwischen den beiden hat. @Pete deutet darauf hin, ohne vollständig dorthin zu gehen.
Am Beispiel von @ Pete würden wir eine (möglicherweise abstrakte) Unterklasse für Wheeled Vehicle einführen, die von der ursprünglichen Basisklasse abstammt - während die beiden Unterklassen davon abstammen. Somit ist die ursprüngliche Basisklasse nicht mit Rädern verschmutzt, die Gemeinsamkeit von Rädern ist jedoch TROCKEN (wird bei Unterklassen mit Rädern nicht wiederholt).
Dies kann für Ihre Zwecke natürlich übertrieben sein, wird jedoch vom Mechanismus der Klassenhierarchie unterstützt.
quelle
Ich werde hier Devil's Advocate spielen.
Im Moment solltest du nichts tun .
Ist es trocken? Nein. Aber es ist besser, ein wenig zu duplizieren als eine vorzeitige Abstraktion, von der Sie später nicht so einfach zurückkehren können. Der Refactor zum Verschieben einer Eigenschaft in eine allgemeine Basisklasse ist einfach. Den anderen Weg zu gehen, ist es nicht. Warten wir es ab.
Wenn ich eine solche Entscheidung treffe, tendiere ich dazu, eine "Regel von 3" zu verwenden: Wenn ich dasselbe z. B. an drei verschiedenen Stellen wiederholt habe, denke ich erst dann darüber nach, es die Kette hochzuschieben. NB du bist erst um 2.
quelle
Im Allgemeinen würde ich es in die Basisklasse verschieben. Ich glaube nicht, dass es ein Ja / Nein-Ziel gibt, weil es hier einen Kompromiss gibt - nicht genutzte Felder zu tragen und Komplexität zu reduzieren.
Normalerweise bevorzuge ich 'schwere' Basisklassen, die alles enthalten, was geteilt werden kann. Dies vereinfacht die Serialisierung in Dateien, da Sie nicht in jeder abgeleiteten Klasse untergeordnete Serialisierungsmethoden benötigen. Aber wenn Sie das oder ein ähnliches Problem nicht haben oder alles tun müssen, um die Speichernutzung zu reduzieren, sollten Sie die Felder nur dort belassen, wo Sie sie benötigen.
Eine 'Intermediary'-Klasse, die die allgemeinen Felder einführt, ist in Ordnung, wenn Sie eine sehr begrenzte Anzahl von Feldern haben. Beachten Sie jedoch, dass der Ansatz die Komplexität erheblich erhöhen kann, wenn Sie Dutzende von Feldern in verschiedenen Kombinationen verwenden, was dazu führt, dass viele Zwischenklassen jeweils einen bestimmten Satz von Feldern einführen. Das kann zu einem Wartungsproblem werden.
quelle