继承和转换对象

时间:2009-03-16 13:06:05

标签: c# oop

我有SalesMan类,它继承自User类,并且还实现了ISalesMan接口。

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

我需要将User个对象转换为SalesMan个对象。我知道从User类型的对象直接转换为SalesMan类型是不可能的。我应该怎么做转换?我正在考虑两种不同的方式:

  1. SalesMan类创建构造函数,该类获取User参数并根据给定的SalesMan初始化新的User对象。

  2. SalesMan类创建新方法,该方法将User作为参数,并根据给定的SalesMan参数返回新的User对象。

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

5 个答案:

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

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