代码之家  ›  专栏  ›  技术社区  ›  Clack

继承和转换对象

  •  1
  • Clack  · 技术社区  · 16 年前

    我有 SalesMan 从继承的类 User 类和也实现 ISalesMan 接口。

    public class SalesMan : User, ISalesMan
    {
     ...
    }
    

    我需要转换 用户 对象进入 推销员 物体。我知道直接演员来自 用户 对象类型 推销员 类型不可能。我应该如何进行转换?我有两种不同的想法:

    1. 正在为创建构造函数 推销员 需要的类 用户 参数并初始化新的 推销员 基于给定的 用户 .

    2. 正在为创建新方法 推销员 需要的类 用户 作为参数并返回 推销员 基于给定的 用户 参数。

    …还是有更聪明的方法来解决这类问题?

    5 回复  |  直到 13 年前
        1
  •  4
  •   Ian Nelson    16 年前

    选项1中描述的构造器是我在寻找一个不熟悉的API时所期望的。

    不过,它们可能是令人厌烦的野兽,在向用户类添加新字段时,您可能会忘记更新它们。因此(如果性能考虑允许),考虑使用反射编写“智能”构造函数, along the lines of this example .

    关于建设者与工厂方法的问题, Framework Design Guidelines 提供以下建议:

    • 与工厂相比,更喜欢建筑工人,因为他们 通常更有用、更一致, 方便又专业 施工机制。

    • 如果你需要更多的控制,考虑使用工厂。 由施工人员提供 创建实例。

    • 在开发人员可能不知道要使用哪种类型的工厂
      构造,例如编码时
      对基类型或接口。

    • 如果只有命名方法才能 进行操作 不言自明。

        2
  •  0
  •   sipsorcery    16 年前

    选项1是最整齐和最直观的。

        3
  •  0
  •   Seb Rose    16 年前

    如果您真的想从用户对象创建一个销售人员对象,那么您描述的任何一个选项都可以工作。

    但我认为你需要问问自己你想做什么。用户何时/为什么成为销售员?你想改变现有物体的巴哈维奥吗?你的行为在你的系统中有规律的改变吗?

    根据您的需要,您可以考虑使用策略或模板方法模式。

        4
  •  0
  •   Kunal S    16 年前

    我使用选项1。升级构造函数或转换构造函数。

        5
  •  0
  •   Daniel Henry    16 年前

    你已经收到的答案已经足够了。但是,我注意到你提到了演员阵容是不可能的。如果你有理由使用石膏,你可以 使之成为可能 通过重载运算符。

    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);
        }
    }
    

    伊恩是对的。一般的经验法则是,只有当您有一个不能满足构造函数的功能需求,或者语言的约束开始妨碍您时,才使用工厂。例如,需要两个具有相同签名的不同构造函数。