C# 继承和转换对象
我有C# 继承和转换对象,c#,oop,C#,Oop,我有saller类,该类继承自User类,并实现了ISalesMan接口 public class SalesMan : User, ISalesMan { ... } 我需要将User对象转换为saller对象。我知道从用户类型的对象直接转换为销售人员类型是不可能的。我应该如何进行转换?我有两种不同的想法: 为saller类创建构造函数,该类接受User参数并基于给定的User初始化新的saller对象 为saller类创建新方法,该类将User作为参数,并基于给定的User参数返回新的s
saller
类,该类继承自User
类,并实现了ISalesMan
接口
public class SalesMan : User, ISalesMan
{
...
}
我需要将User
对象转换为saller
对象。我知道从用户
类型的对象直接转换为销售人员
类型是不可能的。我应该如何进行转换?我有两种不同的想法:
saller
类创建构造函数,该类接受User
参数并基于给定的User
初始化新的saller
对象saller
类创建新方法,该类将User
作为参数,并基于给定的User
参数返回新的saller
对象…或者有更聪明的方法来解决这类问题吗?选项1是最整洁、最直观的。选项1是最整洁、最直观的。如果我在一个不熟悉的API中翻找,我会发现选项1中描述的构造函数 但是,编写它们可能会很枯燥,在向用户类添加新字段时,您可能会忘记更新它们。因此(如果性能考虑允许),考虑使用反射编写一个“智能”构造函数, 关于施工人员与工厂方法的问题,承包商提供了以下建议:
- 比起工厂,你更喜欢建筑工人,因为他们是 通常更有用,更一致, 既方便又专业 建设机制
- 如果你需要更多的控制,可以考虑使用工厂 由施工人员在现场提供 创建实例
- 不要使用开发人员可能不知道要使用哪种类型的工厂
构造,例如编码时
针对基类型或接口 - 如果只有使用命名方法才能 做手术 不言自明
选项1中描述的构造器是我在探索一个不熟悉的API时希望找到的构造器 但是,编写它们可能会很枯燥,在向用户类添加新字段时,您可能会忘记更新它们。因此(如果性能考虑允许),考虑使用反射编写一个“智能”构造函数, 关于施工人员与工厂方法的问题,承包商提供了以下建议:
- 比起工厂,你更喜欢建筑工人,因为他们是 通常更有用,更一致, 既方便又专业 建设机制
- 如果你需要更多的控制,可以考虑使用工厂 由施工人员在现场提供 创建实例
- 不要使用开发人员可能不知道要使用哪种类型的工厂
构造,例如编码时
针对基类型或接口 - 如果只有使用命名方法才能 做手术 不言自明
如果您真的想从用户对象创建一个saller对象,那么您描述的任何一个选项都可以使用 但我认为你需要问问自己你想做什么。用户何时/为什么成为销售员?您是否正在尝试更改现有对象的行为?在你的系统中行为是否有规律的改变
根据您的需要,您可以考虑使用策略或模板方法模式。
如果您真的想从用户对象创建SaltMead对象,那么您所描述的任何一个选项都可以工作。
但我认为你需要问问自己你想做什么。用户何时/为什么成为销售员?您是否正在尝试更改现有对象的行为?在你的系统中行为是否有规律的改变根据您的需要,您可以考虑使用策略或模板方法模式。
我使用选项1。升级构造函数或转换构造函数。
我使用选项1。升级构造函数或转换构造函数。您已经收到的答案已经足够了。然而,我注意到你提到不可能进行铸造。如果您有某种理由使用强制转换,那么可以通过重载运算符来实现public static explicit operator SalesMan(User user)
{
// Your logic to create a new SalesMan using data from user.
}
确定哪种解决方案更智能需要比您在原始帖子中提供的更多信息。然而,我倾向于强调完整性和多功能性,并考虑两者兼而有之
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);
}
}
伊恩是对的。一般的经验法则是,只有当您有一个构造函数无法满足的功能需求,或者语言的约束开始妨碍您时,才使用工厂。例如,需要两个具有相同签名的不同构造函数。您已经收到的答案就足够了。然而,我注意到你提到不可能进行铸造。如果您有某种理由使用强制转换,那么可以通过重载运算符来实现
public static explicit operator SalesMan(User user)
{
// Your logic to create a new SalesMan using data from user.
}
确定哪种解决方案更智能需要比您在原始帖子中提供的更多信息。然而,我倾向于强调完整性和多功能性,并考虑两者兼而有之
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);
}
}
伊恩是对的。一般的经验法则是,只有当您有一个构造函数无法满足的功能需求,或者语言的约束开始妨碍您时,才使用工厂。例如,需要两个具有相同签名的不同构造函数。本文中描述的“智能”复制构造函数仅适用于值类型字段。此外,如果必须像这样构造许多实例,那么反射可能太慢了。我不会将选项1称为复制构造函数。它们的形式通常是:MyClass(MyClass o)This