【问题标题】:Datatypes and polymorphism数据类型和多态性
【发布时间】:2013-05-06 05:43:47
【问题描述】:

我有一个设计问题。我想要实现接口的自定义数据类型。例如,使用模板很简单(也许下一个设计不正确——因为我可以做一个通用类而不是下一个——但明确了我的目标):

template <typename T>
class IDatatype
{
public:
    virtual T getData() const = 0;
    virtual void setData(T pData) = 0;
};

class MyChar: public IDatatype<char>
{
public:
    void setData(char pData){...}
    char getData() const{...}

private:
    char _data;
};

class MyInt: public IDatatype<int>
{
public:
    void setData(int pData){...}
    int getData() const{...}

private:
    int _data;
};

IDatatype<int> *data = new MyInt(); // parametrized interface, bad idea :(
data->getData(); // it works ok

从前面的类中,很容易得到每个_data类成员对应的属性。我的问题:

有什么方法(改变设计等)在 IDatatype 中实现泛型 setter 和 getter 对于任何类型,从而操作每个类的 _data 属性 在界面中不使用模板?

例如:

class IDatatype
{
public:
    // pure virtual getters and setters for specialized _data fields. Here is my design question.
};

class MyChar: public IDatatype
{
public:
    void setData(char pData){...};
    char getData(){...};

private:
    char _data;
};

class MyInt: public IDatatype
{
public:
    void setData(int pData){...};
    int getData(){...};

private:
    int _data;
};

IDatatype *intData = new MyInt(); // no parametrized interface!
intData->getData(); // how can I create this method from IDatatype?

IDatatype *charData = new MyChar();
charData->getData(); // the same here

注意:我的英语不好,如有错误请见谅:)

【问题讨论】:

  • C++ 不是做这些事情的正确语言。您不能自动执行此操作,只能手动执行此操作,方法是在对象中保存类型标识,通过创建访问者可能是,通过将 void* (boost::any, boost::variant) 存储为字段等...
  • answer。 @ForEveR 说了很多。

标签: c++ types polymorphism


【解决方案1】:

您可以通过 3 种方式实现这一点,没有一种像使用模板那样优雅且无错误

  1. 在基类中将数据定义为 int/float/char 的联合,并通过基类的 set/get 方法对该联合进行操作。整个 VB(旧 VB 6)类系统都在这种称为 VARIANT 的数据类型上工作。
  2. 从基类返回 void * 并根据需要进行转换和使用 - 哎呀,祝你好运!!。
  3. 从 getData 返回基本接口引用本身,虽然看起来有意义,但根本没有任何意义。 4.

【讨论】:

  • 呃,你的第二个和第三个提案有什么问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 2017-01-14
  • 2011-07-10
  • 1970-01-01
相关资源
最近更新 更多