[英]virtual function design issue
我有一個基類,目前我有一個名為get_value()的方法,它應該返回適當轉換為各種原始數據類型的值。 因為,我們不能只有返回類型的虛擬方法,我必須做以下事情:
virtual void get_value(unsigned int index, unsigned char & r) const = 0;
virtual void get_value(unsigned int index, char & r) const = 0;
virtual void get_value(unsigned int index, unsigned short & r) const = 0;
virtual void get_value(unsigned int index, short & r) const = 0;
virtual void get_value(unsigned int index, unsigned int & r) const = 0;
virtual void get_value(unsigned int index, int & r) const = 0;
virtual void get_value(unsigned int index, float & r) const = 0;
virtual void get_value(unsigned int index, double & r) const = 0;
從維護的角度來看這非常煩人,並且由於用戶必須執行以下操作,因此使用有點尷尬:
unsigned char v;
obj->get_value(100, v);
無論如何,所有子類都必須覆蓋這些類型的事實是令人討厭的。 我想知道是否有人有任何建議要避免這種情況,或者以某種方式僅通過一個虛擬功能以更緊湊的方式做到這一點。
子類可以是這樣的:
void get_value(unsigned int index, unsigned char & r) const {get<unsigned char>(index, r);}
void get_value(unsigned int index, char & r) const {get<char>(index, r);}
void get_value(unsigned int index, unsigned short & r) const {get<unsigned short>(index, r);}
void get_value(unsigned int index, short & r) const {get<short>(index, r);}
void get_value(unsigned int index, unsigned int & r) const {get<unsigned int>(index,r);}
void get_value(unsigned int index, int & r) const {get<int>(index,r);}
void get_value(unsigned int index, float & r) const {get<float>(index,r);}
void get_value(unsigned int index, double & r) const {get<double>(index,r);}
這個專門的模板get方法為每個子類做了特定的事情。
您應該考慮創建不同的功能。
int getInt();
double getDouble();
等等。
看來您的調用代碼必須知道任何情況下的差異 。 由於您可以執行的操作(顯然至少)沒有真正的抽象,因此您可以明確區分。 模板和面向對象的類可能只會增加不必要的復雜性。
當然,為了判斷這一點,人們可能需要更多的背景。 只是我0.02€:)
您可能想看看模板 。 它們允許您指定類型,如下所示:
foo<float>(bar); // calls the float version
foo<int>(bar); // calls the int version
你可以有一個虛函數調用返回一個boost::variant
如下所示:
using vartype = boost::variant<
unsigned char,
char,
unsigned short,
short,
// ...
>;
virtual vartype get_value(unsigned int index) const = 0;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.