У меня была беседа с коллегой, и в итоге у нас возникли противоречивые представления о цели создания подклассов. Моя интуиция заключается в том, что если основная функция подкласса должна выражать ограниченный диапазон возможных значений его родителя, то, вероятно, это не должен быть подкласс. Он высказался за противоположную интуицию: то, что подклассы представляют объект более «специфично», и, следовательно, отношение подкласса является более подходящим.
Чтобы выразить свою интуицию более конкретно, я думаю, что если у меня есть подкласс, который расширяет родительский класс, но единственный код, который переопределяет подкласс, - это конструктор (да, я знаю, что конструкторы обычно не "переопределяют", терпите меня), тогда что было действительно необходимо, так это вспомогательный метод.
Например, рассмотрим этот несколько реальный класс:
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 в основном возвращали информацию об анти-шаблоне телескопического конструктора, а не то, что я искал.