具有属性的对象,该属性可以对同一属性进行不同类型的类型

Object with attribute that can different type for the same attribute

本文关键字:属性 同类型 类型 对象      更新时间:2023-10-16

我正在尝试找出c ++程序的最佳方法:

我需要制作一个名为特征的对象。这家伙有4个属性:
- 字符串名称(只是名称)
- ? 类型(它是什么类型的特征。可以是数字的,也可以是描述性的)
- ? 范围(数字 - 最小值和最大值
描述性 - 选项)
- ? 值(实际选择的值可以是 int 或字符串,具体取决于类型)

如果我在Java中,我会创建一个带有两个子对象的对象类型:数字和描述。每个都将具有适当的范围,并以适当的格式存储值。

两者的示例:
名称:温暖
类型:数字
范围:最小 1 最大 5
值:2

名称:样式
类型:描述性
范围:简约摄影
价值:简约

我不知道在 c++ 中执行此操作的最佳方法是什么。
我应该查看模板吗?因为如果是这样,我无法弄清楚如何使用它们。

如果你愿意,你可以做与Java相同的事情。

struct Type {
    std::string Name;
};
struct Numeric : Type {
    int value, min, max;
};
struct Descriptive : Type {
    std::string value, min, max;
};

但是,在决定如何实现特征之前,您必须更好地定义如何使用它以及所需的接口。例如,上述内容使将 Type 对象用作多态对象并不容易使用。您必须手动检查类型指针是否指向数字或描述性并采取相应操作。


获得多态性的一种方法是C++是使用虚拟方法:

struct Type {
    ~Type() {} // virtual destructor
    virtual void do_something() = 0; // pure virtual function. Derived classes must provide an implementation
    std::string Name;
};
struct Numeric : Type {
    virtual void do_something() {
        std::cout << "Numeric value: " << value << " (" << min << ',' << max << ")n"; 
    }
    int value, min, max;
};
struct Descriptive : Type {
    virtual void do_something() {
        std::cout << "Descriptive value: " << value << " (" << min << ',' << max << ")n"; 
    }
    std::string value, min, max;
};

现在,当您在Type *上调用do_something时,它将找出动态类型的正确方法并调用它。

C++有几种方法可供选择:

  • 遗产。不仅仅是Java可以做到这一点。如果这是你在Java中使用的方法,我不明白为什么你不能在C++中做同样的事情。
  • 模板。这种方法对应于Java泛型。
  • 工会。我不认为有一个对应的Java,可能值得研究。

如果没有进一步的细节,就不可能给出很好的论据,为什么你应该更喜欢其中一个。