考慮下面的設計:如何在使用多態性時避免下滑?
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
將被解碼爲MessageB
。 RawDataA
和RawDataB
都共享一些常用數據,因此RawDataBase
被創建爲基類。 同樣適用於MessageA
和MessageB
,源自。
然後,將一個虛擬Decode
函數添加到中,以RawDataBase
對象作爲參數。但在MessageA
和MessageB
中有一些問題。對於MessageA
,參數實際上應該始終爲RawDataA
,因此必須在此完成壓鑄。但是有人說,在代碼中使用下拉式演員時必定存在一些設計問題。
所以我的問題是如何設計這裏的代碼,以避免羽絨被?
謝謝!
'模板'似乎比繼承在這裏更好分解代碼。 – Jarod42
你是否也指CRTP?或其他解決方案。謝謝! – xYZ
不需要CRTP,一個簡單的模板類。 – Jarod42