我当时正在与一位同事进行讨论,但最终我们对继承的目的产生了矛盾的直觉。我的直觉是,如果子类的主要功能是表达其父级的可能值的有限范围,则它可能不应该是子类。他主张相反的直觉:子类化表示对象的“特定性”更高,因此子类关系更合适。
更具体地讲,我认为如果我有一个扩展父类的子类,但是该子类覆盖的唯一代码是构造函数(是的,我知道构造函数通常不会“重写”,请耐心等待),然后真正需要的是一种辅助方法。
例如,考虑一下这个现实生活的类:
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上的搜索大都返回了有关伸缩构造函数反模式的信息,而不是我真正想要的信息。