Rozmawiałem ze współpracownikiem i skończyły się sprzeczne intuicje na temat celu podklasy. Moją intuicją jest to, że jeśli podstawową funkcją podklasy jest wyrażenie ograniczonego zakresu możliwych wartości jej elementu nadrzędnego, prawdopodobnie nie powinna to być podklasa. Argumentował za odwrotną intuicją: ta podklasa reprezentuje bardziej „specyficzny” obiekt, a zatem relacja podklasy jest bardziej odpowiednia.
Mówiąc bardziej konkretnie, uważam, że jeśli mam podklasę, która rozszerza klasę nadrzędną, ale jedynym kodem, który zastępuje podklasę, jest konstruktor (tak, wiem, że konstruktory na ogół nie „nadpisują”, trzymaj się mnie), to tak naprawdę potrzebna była metoda pomocnicza.
Rozważmy na przykład nieco prawdziwą klasę:
public class DataHelperBuilder
{
public string DatabaseEngine { get; set; }
public string ConnectionString { get; set; }
public DataHelperBuilder(string databaseEngine, string connectionString)
{
DatabaseEngine = databaseEngine;
ConnectionString = connectionString;
}
// Other optional "DataHelper" configuration settings omitted
public DataHelper CreateDataHelper()
{
Type dataHelperType = DatabaseEngineTypeHelper.GetType(DatabaseEngine);
DataHelper dh = (DataHelper)Activator.CreateInstance(dataHelperType);
dh.SetConnectionString(ConnectionString);
// Omitted some code that applies decorators to the returned object
// based on omitted configuration settings
return dh;
}
}
Twierdzi, że posiadanie takiej podklasy byłoby całkowicie właściwe:
public class SystemDataHelperBuilder
{
public SystemDataHelperBuilder()
: base(Configuration.GetSystemDatabaseEngine(),
Configuration.GetSystemConnectionString())
{
}
}
Tak więc pytanie:
- Która z tych intuicji jest poprawna wśród ludzi, którzy mówią o wzorach projektowych? Czy podklasa, jak opisano powyżej, jest anty-wzorem?
- Jeśli jest to anty-wzór, jak się nazywa?
Przepraszam, jeśli okaże się, że jest to odpowiedź łatwa do przeszukiwania; moje wyszukiwania w google zwróciły głównie informacje na temat anty-wzorca teleskopowego konstruktora, a nie tak naprawdę tego, czego szukałem.