具有属性的对象可以为同一属性提供不同的类型

Posted

技术标签:

【中文标题】具有属性的对象可以为同一属性提供不同的类型【英文标题】:Object with attribute that can different type for the same attribute 【发布时间】:2012-04-18 19:57:55 【问题描述】:

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

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

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

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

名称:风格 类型:描述性 范围:简约摄影 价值观:简约

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

【问题讨论】:

【参考方案1】:

如果你愿意,你可以做和 Java 一样的事情。

struct Type 
    std::string Name;
;

struct Numeric : Type 
    int value, min, max;
;

struct Descriptive : Type 
    std::string value, min, max;
;

但是,在您决定如何实现您的特性之前,您必须更好地定义您将如何使用它以及您想要的界面。例如,上面的内容并不便于将 Type 对象用作多态对象。您必须手动检查 Type 指针是否指向 Numeric 或 Descriptive 并采取相应措施。


获得多态性的一种方法是 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 时,它会为动态类型找出正确的方法并调用它。

【讨论】:

有没有办法实现自动化?该特征将成为 PieceOfClothing 的一部分,其中包含它们的哈希表,而哈希表又将存储在 Closet 对象中。这是否更清楚? @kotoko 这还不够,但我可以扩展我的示例,用一种方法来自动使用数字和描述性。【参考方案2】:

您可以在 C++ 中选择多种方法:

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

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

【讨论】:

我将如何为此使用模板?你能举个小例子吗?这个特征将是 PieceOfClothing 的一部分,其中包含它们的哈希表,而哈希表又将存储在 Closet 对象中。

以上是关于具有属性的对象可以为同一属性提供不同的类型的主要内容,如果未能解决你的问题,请参考以下文章

面向对象编程 多态

如何在plsql中将对象类型属性的值分配给具有相同属性属性的不同对象类型?

具有命名属性和不同类型的任意命名索引属性的打字稿接口[重复]

Kellerman Compare .NET Objects:比较具有不同属性名称的不同类型的对象

Microsoft Access - 将对象属性复制到同一类型的另一个对象

C# 类型转换具有不同值的对象属性