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

类之间的转换[关闭]

  •  2
  • Nima  · 技术社区  · 16 年前

    假设我们有一个叫A的班和另一个叫B的班。 我们想要一个转换方法,把A转换成B。

    在软件体系结构的观点中,哪一个是首选的?

    1. A.export()
    2. B.import()
    3. 编写一个转换器类,即 convert(A, B) Convert(A) 或者…

    如果语言很重要,我用C++

    5 回复  |  直到 9 年前
        1
  •  6
  •   James McNellis    16 年前

    它完全取决于您打算如何使用它,但在许多情况下,实现这一点的最干净的方法是实现转换构造函数:

    class B { };
    class A
    {
        A(const B& b) { }
    };
    
    B b;
    A a = b; //< calls converting constructor
    

    (当然,您可以实现一个转换构造函数来从 A B 也一样)

        2
  •  2
  •   Uri    16 年前

    首先,决定它们之间的转换是否真的是自然和直观的。在这种情况下,可以使用构造函数或成员函数。

    但是,如果连接不是很自然,您可能希望使用一个单独的conversionutils类和转换方法或类似的方法。您不希望开始在类之间创建太多的依赖项,或者最终实现N*N转换。

    注意“转换构造函数”也很重要,因为它们可以在您没有意识到的情况下被调用。例如,如果我有 a 和A b 我写的东西 a==b ,如果a或b中存在采用另一个的构造函数,则可能导致成功编译而不发出警告,并且可能在运行时产生有趣的结果。我强烈建议你做你的建设者 explicit 在这些情况下。

        3
  •  1
  •   Peter Jaric    16 年前

    如果我们简单地看一下Java(仅仅是为了信息,即使你使用C++):

    假设类A是字符串,类B是整数(或double、boolean、et c)。Java库设计器将一个静态方法放在整数(“b”)中,称为GigType(“导入”),它接受字符串(“a”)并生成整数(“b”)。那就是你的情况2。

    另一方面,在每个类(称为“a”)中,都有一个方法ToString(“export”)返回一个字符串(“b”)。那就是你的情况1。

    所以,即使对于这样的基础课程,他们也决定使用不同的方法。我想这和@james mcnellis所说的一样:这要看情况而定。

        4
  •  0
  •   Puppy    16 年前

    您可以重载强制转换运算符,即运算符t()..返回t值。你是否应该这样做是另一回事。

        5
  •  0
  •   Patrick    16 年前

    我会采纳你的第三个建议。用于转换的单独转换器类。这样,您就不会直接将A与B或B与A耦合起来。无论是什么,A和B都有自己的职责。

    转换器类C的职责是纯转换。每堂课都要对一件事负责,我认为这是件好事。我相信这是固体设计原则(单一责任原则)中的S。