gpt4 book ai didi

c++ - 使用多态时如何避免向下转换?

转载 作者:行者123 更新时间:2023-11-30 05:10:34 26 4
gpt4 key购买 nike

考虑以下设计:

class RawDataBase
{
private:
std::string data;
};

class RawDataA : public RawDataBase
{
private:
int spec_data_for_a1;
int spec_data_for_a2;
};

class RawDataB : public RawDataBase
{
private:
int spec_data__for_b;
};

class MessageBase
{
private:
int x;
int y;
int z;
public:
virtual void Decode(RawDataBase *raw)
{
// extract x,y,z from raw.data
}
};

class MessageA : public MessageBase
{
private:
int spec_data_for_a1;
int spec_data_for_a2;
public:
/* Here raw must be RawDataA*/
virtual void Decode(RawDataBase *raw)
{
MessageBase::Decode(raw);
RawDataA raw_data = static_cast<RawDataA*>(raw);
// extract spec_data_for_a1, spec_data_for_a2 from raw_data
}
};

class MessageB : public MessageBase
{
private:
int spec_data__for_b;
public:
/* Here raw must be RawDataB*/
virtual void Decode(RawDataBase *raw)
{
MessageBase::Decode(raw);
RawDataB raw_data = static_cast<RawDataB*>(raw);
// extract spec_data__for_b from raw_data
}
};

我在将 RawData 解码为 Message 时遇到设计问题。

RawData 有两种类型(RawDataA & RawDataB)。 RawDataA会被解码为MessageA,而RawDataB会被解码为MessageBRawDataARawDataB 共享一些公共(public)数据,因此创建了RawDataBase 作为基类。从 MessageBase 派生的 MessageAMessageB 也是如此。

然后,在MessageBase中添加一个虚拟的Decode函数,以RawDataBase对象作为参数。但是 MessageA 中有一些问题 和 MessageB。对于 MessageA,参数实际上应该始终是 RawDataA,因此必须在此处进行向下转换。但是有人说必须在代码中使用向下转换时一定存在设计问题。

所以我的问题是如何设计这里的代码以避免向下转换?

谢谢!

最佳答案

这里为了避免向下转换:

class MessageA : public MessageBase {
virtual void Decode(RawDataBase *raw) { ...}
}

你的代码必须变成这样:

class MessageA : public MessageBase {
virtual void Decode(RawDataA *raw) { ...}
}

这意味着 MessageBase 必须以某种方式变成:

class MessageBase {
virtual void Decode(RawDataA *raw){...}
}

这可以使用这样的模板来完成:

class RawDataBase { /* ... */ };
class RawDataA : public RawDataBase { /* ... */ };
class RawDataB : public RawDataBase { /* ... */ };

template<typename T>
class MessageBase {

using RawDataType = T;

// ...

virtual void Decode(RawDataType *raw){/* ... */}

// ...

};

class MessageA : public MessageBase<RawDataTypeA> {
// ...

virtual void Decode(RawDataType *raw){/* ... */}

// ...
};

class MessageB : public MessageBase<RawDataTypeB> {
// ...

virtual void Decode(RawDataType *raw){/* ... */}

// ...
};

关于c++ - 使用多态时如何避免向下转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45608133/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com