我有三个不同的对象作为创建对象A的输入。三个不同的对象是:
现在我在对象A上有一个静态方法,如下所示:
public class ObjectA
{
// class code
public static ObjectA CreateFromType(DataRow row) {/*implementation */}
public static ObjectA CreateFromType(ObjectA obj) {/*implementation */}
public static ObjectA CreateFromType(ObjectB obj) {/*implementation */}
}
这是一个好方法吗?这是违反OCP的代码气味吗?你会如何实现这个?
答案 0 :(得分:3)
为什么不提供适当的构造函数而不是工厂方法?是否存在ObjectA
可以“默认创建”的第四种情况?
构造函数作为一种方法具有明显的优势,因为当有人即将创建一个时,它们是ObjectA
的公共接口中最明显的部分。如果要以你提到的方式之一创建实例的主要场景,我会强烈建议构造函数。
特别提到“克隆”构造函数:如果你的程序集中有其他可克隆的类,那么定义你自己的IClonable
派生词以及定义明确的语义(浅或深)可能是有意义的克隆)并使用该方法而不是复制构造函数。
答案 1 :(得分:3)
为什么不在ObjectA
上创建不同的构造函数?还是显式或隐式运算符?在你的情况下我不认为需要静态方法。
答案 2 :(得分:2)
看起来不错,不过你也可以使用构造函数
public class ObjectA
{
// class code
public ObjectA(DataRow row) {/*implementation */}
public ObjectA(ObjectA obj) {/*implementation */}
public ObjectA(ObjectB obj) {/*implementation */}
}
答案 3 :(得分:0)
可以自己创建ObjectA
并独立初始化吗?我倾向于让你的构造函数没有这种数据传输,而是创建对象方法来初始化3种不同场景的数据。
如果您希望从ObjectA继承并专门化数据传输,这也可以提高灵活性。