代码之家  ›  专栏  ›  技术社区  ›  langlauf.io

如何建模和实现可能从不同类继承的类?

  •  0
  • langlauf.io  · 技术社区  · 9 年前

    我的模型中有以下“实体”: DataItem , String , Integer Argument . 我不确定如何创建反映以下方面的类图:

    • A. 一串 是一个 数据项
    • 整数 是一个 数据项
    • 论点 可以是 一串 整数 ,或 数据项 (即两者都不是 一串 也没有 整数 ).

    我必须创建额外的类“StringArgument”、“IntegerArgument“和“DataItemArgument)吗?还是有更好的解决方案?我假设使Argument继承自 一串 , 整数 数据项 这不是一个好的解决方案,对吧?

    一般来说:如何对类继承自一个类或另一个类的情况进行建模?

    PS:实现将在Python 2.7中实现,但我对一般问题感兴趣,因此引用其他语言的任何解决方案都可以。

    2 回复  |  直到 9 年前
        1
  •  1
  •   Andrew    9 年前

    一种方法是将 Argument 概念与数据项的概念不同。你说得很对 String Integer 都是 DataItem s、 但我不相信 论点 是一个 数据项 。它只容纳一个。这自然会导致:

        DataItem
         ^    ^
        /      \
       |       |
    String    Integer
    

    论点 将保存指向 数据项 一个参数可以包含不止一个数据(项);例如,如果它是程序的命令行参数,则可能需要保留位置信息。因此,我认为 包含 数据,而不是参数 存在 数据。

    class Argument {
      public:
        // etc
      private:
        DataItem* data;
    };
    

    (注意,这种方法可以在大多数支持面向对象编程的语言中实现)。

    你可以 StringArgument IntegerArgument 作为单独的类型,持有相关类型的成员,尽管这样做的相关性会根据情况和实现语言而有所不同(例如,在Python中,您不会在意它是否是 整数 一串 ,只要它订阅了 数据项 ). 在C++中,您可以使用模板来提供 论点 类作为通用容器:

    template <typename data_type>
    class Argument {
      public:
        // etc.
      private:
       data_type data;
    };
    
    typedef Argument<String> StringArgument; // "composes a" String
    typedef Argument<Integer> IntegerArgument; // "composes an" Integer
    

    换言之,具体如何实现这一点取决于所选语言提供的功能,但如果不将参数视为“一种”数据,而是将其视为“数据的容器(或持有者)”,则设计会更简单。

    作为另一个例子,在C++中 论点 类型继承自相关数据类型。。。

    template <typename data_type>
    class Argument : public data_type {
      // etc.
    };
    
    typedef Argument<String> StringArgument; // "is a" String
    typedef Argument<Integer> IntegerArgument; // "is an" Integer
    

    (注意,这种方法需要一种语言来支持通用编程,其意义类似于C++模板)。

    这又回到了争论的观点 存在 然而,数据,而不是包含数据。

        2
  •  1
  •   Paco    9 年前

    在我看来,你的泛型类是 Argument ,并且您的其他三个类应该从中继承。

    这确实需要包装类 String Integer .

    你的问题让我想起了复合设计模式,但我不确定它是否是你想要的。