Obecnie mam dwie klasy pochodzące, A
i B
, że obaj mają równe wspólnego i próbuję ustalić, czy należy przejść do klasy podstawowej.
Nigdy nie jest przywoływany z klasy podstawowej i powiedzmy, że jeśli w pewnym momencie drogi zostanie wyprowadzona inna klasa C
, która nie ma _field1
, to nie naruszono by zasady „najmniej uprzywilejowanego” (lub czegoś), gdyby było?
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
}
object-oriented
inheritance
abstract-class
Sam jest
źródło
źródło
Base
,A
,B
,C
, i_field1
są. To ważne szczegóły, których nie należy pomijać; Myślę, że powinieneś edytować pytanie, aby porozmawiać o tym, co to jest.Odpowiedzi:
Wszystko zależy od dokładnego problemu, który próbujesz rozwiązać.
Rozważ konkretny przykład: twoja abstrakcyjna klasa podstawowa to
Vehicle
i masz obecnie konkretne implementacjeBicycle
iCar
. Jesteś rozważa przeniesienienumberOfWheels
odBicycle
iCar
do pojazdu. Czy powinieneś to zrobić? Nie! Ponieważ nie wszystkie pojazdy mają koła. Możesz już powiedzieć, że jeśli spróbujesz dodaćBoat
klasę, to się zepsuje.Teraz, jeśli twoja abstrakcyjna klasa bazowa była
WheeledVehicle
, logiczne jest, aby mieć tamnumberOfWheels
zmienną składową.Musisz zastosować tę samą logikę do swojego problemu, ponieważ, jak widać, nie jest to prosta odpowiedź tak lub nie.
źródło
roll()
metodę, w której idea podklasy wygląda proroczo.Logicznie rzecz biorąc, poza umieszczeniem pola replikowanego w podklasach vs. wspólnych w klasie bazowej istnieje trzecia opcja: wprowadzenie nowej podklasy do hierarchii, która ma wspólne właściwości między nimi. @ Pet zawiera podpowiedzi na ten temat, nie w pełni tam idąc.
Korzystając z przykładu @ Pete'a, wprowadzilibyśmy (prawdopodobnie abstrakcyjną) podklasę dla pojazdu kołowego, która pochodzi z oryginalnej klasy podstawowej - podczas gdy dwie podklasy z niej schodzą. Tak więc oryginalna klasa podstawowa nie jest zanieczyszczona kołami, jednak powszechność kół to OSUSZANIE (nie powtarzane wśród podklas, które mają koła).
Może to oczywiście przesadzić z twoimi celami, ale jest to obsługiwane przez mechanizm hierarchii klas.
źródło
Będę tu grał adwokata diabła.
W tej chwili nie powinieneś nic robić .
Czy to jest SUCHE? Nie. Ale lepiej jest mieć odrobinę duplikacji niż przedwczesną abstrakcję, której później nie można łatwo wycofać. Refaktor do przeniesienia właściwości do wspólnej klasy podstawowej jest łatwy. Nie jest inaczej. Poczekaj i zobacz.
Podejmując taką decyzję, staram się stosować „zasadę 3”: kiedy powtórzę to samo, np. W trzech różnych miejscach, i dopiero wtedy rozważam przeniesienie go w górę łańcucha. Uwaga: masz tylko 2 lata.
źródło
Ogólnie rzecz biorąc, przeniósłbym go do klasy podstawowej. Nie sądzę, aby istniał obiektywny tak / nie, ponieważ istnieje tutaj kompromis - przenoszenie nieużywanych pól vs zmniejszanie złożoności.
Zwykle wolę „ciężkie” klasy podstawowe, które zawierają wszystko, co może być udostępniane. To sprawia, że serializowanie do plików jest prostsze, ponieważ nie potrzebujesz potomnych metod serializacji w każdej klasie pochodnej. Ale jeśli nie masz tego lub podobnego problemu, a może musisz zrobić wszystko, co możliwe, aby zmniejszyć zużycie pamięci, wtedy pozostawienie tylko tych pól, które są potrzebne, powinno być w porządku.
Klasa „pośrednia”, która wprowadza wspólne pola, będzie dobrze, jeśli masz bardzo ograniczoną liczbę pól. Pamiętaj jednak, że takie podejście może znacznie zwiększyć złożoność, jeśli masz dziesiątki pól używanych w różnych kombinacjach, co prowadzi do wielu klas pośrednich, z których każda wprowadza określony zestaw pól. To może stać się problemem konserwacyjnym.
źródło