Я мав дискусію з колегою, і у нас виникли суперечливі інтуїції щодо мети підкласифікації. Моя інтуїція полягає в тому, що якщо основною функцією підкласу є вираження обмеженого діапазону можливих значень його батьківського, то, ймовірно, це не повинно бути підкласом. Він заперечував протилежну інтуїцію: підкласинг представляє більш "специфічний" об'єкт, і тому підкласові відносини є більш підходящими.
Якщо конкретніше сказати, я думаю, що якщо у мене є підклас, який розширює батьківський клас, але єдиним кодом, який підклас переосмислює, є конструктор (так, я знаю, що конструктори, як правило, не "переосмислюють", майте на собі) те, що було дійсно потрібно, - це допоміжний метод.
Наприклад, розглянемо цей дещо реальний клас:
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;
}
}
Він стверджує, що цілком підходящим був би такий підклас:
public class SystemDataHelperBuilder
{
public SystemDataHelperBuilder()
: base(Configuration.GetSystemDatabaseEngine(),
Configuration.GetSystemConnectionString())
{
}
}
Отже, питання:
- Серед людей, які говорять про шаблони дизайну, яка з цих інтуїцій є правильною? Чи підкласифікація, описана вище, є антидіаграмою?
- Якщо це анти-візерунок, як його називати?
Я прошу вибачення, якщо це виявилося легко відповісти в Google; мої пошуки в Google в основному повертали інформацію про анти-візерунок конструктора телескопічного зв’язку, а не про те, що я шукав.