我有SalesMan
类,它继承自User
类,并且还实现了ISalesMan
接口。
public class SalesMan : User, ISalesMan
{
...
}
我需要将User
个对象转换为SalesMan
个对象。我知道从User
类型的对象直接转换为SalesMan
类型是不可能的。我应该怎么做转换?我正在考虑两种不同的方式:
为SalesMan
类创建构造函数,该类获取User
参数并根据给定的SalesMan
初始化新的User
对象。
为SalesMan
类创建新方法,该方法将User
作为参数,并根据给定的SalesMan
参数返回新的User
对象。
...还是有更聪明的方法来解决这类问题?
答案 0 :(得分:4)
如果我在寻找一个不熟悉的API,我会期望找到选项1中描述的构造函数。
它们可能是无聊的野兽,但是在向User类添加新字段时可能会忘记更新它们。因此(如果性能考虑因素允许),请考虑使用反射along the lines of this example来编写“智能”构造函数。
关于构造函数与工厂方法的问题,Framework Design Guidelines提供了以下建议:
更喜欢施工人员到工厂,因为他们是 通常更有用,更一致, 方便然后专业 建设机制。
如果您需要更多控制权,请考虑使用工厂 由建设者提供 创建实例。
请使用工厂,开发人员可能不知道要使用哪种类型 构造,例如编码时 对基本类型或接口。
如果使用命名方法,则使用工厂的CONSIDER是唯一的方法 做手术 不言自明的。
答案 1 :(得分:0)
选项1是最整洁,最直观的。
答案 2 :(得分:0)
如果你真的想从User对象创建一个SalesMan对象,那么你描述的任何一个选项都可以。
但我认为你需要问问自己你想做什么。何时/为什么用户成为SalesMan?你想改变现有物体的行为吗?行为会在您的系统中定期更改吗?
根据您的需要,您可以考虑使用策略或模板方法模式。
答案 3 :(得分:0)
我使用选项1.升级构造函数或转换构造函数。
答案 4 :(得分:0)
您已经收到的答案绰绰有余。但是,我注意到你提到铸造是不可能的。如果您有某种理由使用强制转换,您可以通过重载运算符来使其成为可能。
public static explicit operator SalesMan(User user)
{
// Your logic to create a new SalesMan using data from user.
}
确定哪个解决方案 smarter 需要的信息比原始帖子中提供的信息要多。但是,我倾向于在完整性和多功能性方面表现出色,并考虑两者兼顾。
public class SalesMan
{
public SalesMan(User user)
{
// Your logic to create a new SalesMan using data from user.
}
public static explicit operator SalesMan(User user)
{
return new SalesMan(user);
}
}
伊恩是对的。一般经验法则是,只有当您具有构造函数无法满足的功能要求时才使用工厂,或者语言的约束开始妨碍您。例如,需要两个具有相同签名的不同构造函数。