【发布时间】:2015-10-20 19:59:49
【问题描述】:
假设我有几个类A1、A2、A3,它们的数据可以存储在同一个POD数据结构D中。这些类在管理数据的方式上有所不同,例如,动态数据结构的分配位置。然而在语义上,它们代表所有相同类型的数据。
我的一个A? 类被设计成对D 的封装。它可以基于现有的D 构建而无需复制。
现在我想以统一的方式实现对所有A? 类的读取访问。我不想使用虚方法,也不想模板化所有使用A? 类的代码。
下面的设计合理吗?
这个模式有名字吗? (门面?)
有什么明显的陷阱吗?
/* in practice, D is large or should not be copied for other reasons */
struct D { int * mymember; }
struct ACRef {
ACRef (D const & d) : m_dataref (&d) { }
/* operations for A-like classes */
int getMyMember () const { return *(m_dataref->mymember); }
private:
D const * m_dataref;
};
struct A1 {
/* A1 stuff, manages m_data.mymember in a particular way */
// implicit conversion to ACRef possible
// kind of "is a" relationship: an A1 "is an" ACRef
operator ACRef () { return ACRef {this->m_data}; }
private:
D m_data;
};
struct A2 {
explicit A2 (D & d) : m_data (&d) { }
/* A2 stuff, manages m_data.mymember in a particular way */
// implicit conversion to ACRef possible
// kind of "is a" relationship: an A2 "is an" ACRef
operator ACRef () { return ACRef {*(this->m_data)}; }
private:
D * m_data;
};
/* A3 defined similar to A1 */
/* function that should operate on A?'s */
int printMyMember (ACRef a) {
std::cout << a.getMyMember () << std::endl;
}
A1 a1;
A2 a2;
// ...
printMyMember (a1);
printMyMember (a2);
【问题讨论】:
-
为什么 A* 结构没有 getMyMember() 方法,或者改为 getDStruct()?
-
为什么不直接使用继承?
-
乍一看应该没问题。你有什么特别的疑问?你能详细说明一下吗?或者你的问题是,如果这包含 Facade 模式?
-
我的疑惑是由于经常阅读的建议不要使用隐式类型转换。第二个原因:我从未在任何地方看到过这种方法。
-
如果我使用继承,A1、A2 和 A3 必须从 ACRef 继承。然而,要么它们都继承了 ACRef 的 D * const 数据成员,要么,如果我将 A? 的 D 数据成员放入 ACRef,那么我无法在不复制现有 D 结构的情况下构建 ACRef。
标签: c++ implicit-conversion facade