Eu estava discutindo com um colega de trabalho e acabamos tendo intuições conflitantes sobre o propósito da subclasse. Minha intuição é que, se uma função primária de uma subclasse é expressar um intervalo limitado de valores possíveis de seu pai, provavelmente não deve ser uma subclasse. Ele argumentou pela intuição oposta: que a subclasse representa um objeto sendo mais "específico" e, portanto, um relacionamento com subclasse é mais apropriado.
Para colocar minha intuição de maneira mais concreta, acho que, se eu tenho uma subclasse que estende uma classe pai, mas o único código que a subclasse substitui é um construtor (sim, eu sei que os construtores geralmente não "substituem", aceite comigo), então o que era realmente necessário era um método auxiliar.
Por exemplo, considere esta classe da vida real:
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;
}
}
Ele afirma que seria totalmente apropriado ter uma subclasse como esta:
public class SystemDataHelperBuilder
{
public SystemDataHelperBuilder()
: base(Configuration.GetSystemDatabaseEngine(),
Configuration.GetSystemConnectionString())
{
}
}
Então, a pergunta:
- Entre as pessoas que falam sobre padrões de design, qual dessas intuições está correta? A subclasse, conforme descrito acima, é um anti-padrão?
- Se é um anti-padrão, qual é o seu nome?
Peço desculpas se isso tiver sido uma resposta fácil de mudar; minhas pesquisas no google geralmente retornavam informações sobre o antipadrão de construtor telescópico e não exatamente o que eu estava procurando.