Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继承和转换对象_C#_Oop - Fatal编程技术网

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