我正在开发自己的WinAPI包装器库,它负责处理与GUI相关的所有事情。我在Android平台上看到了一些移植解决方案(视图,测量/布局/绘制过程,从XML“膨胀”UI)。
现在:我不想重复自己,并为每个View
Button
,GridView
,TextView
等添加手动静态方法,例如创建和充气。 )。
Base View
类派生自(将View传递给T):
template<class T>
class ICreatable : std::enable_shared_from_this<T> {
public:
static std::shared_ptr<T> create() {
return std::shared_ptr<T>(new T()); //assume that T has such constructor
}
static std::shared_ptr<T> inflate(AttributeSet* attrs) {
return std::shared_ptr<T>(new T(attrs)); //assume that T has such constructor
}
std::shared_ptr<T> ptr() {
return enable_shared_from_this::shared_from_this();
}
};
子类派生自View和ICreatable:
class Button : public View, public ICreatable<Button> {
//...
}
现在我必须以某种方式处理模棱两可的问题 - Button有一个ICreatable,View和Button都被传递为T.我希望Button
用ICreatable<View>
覆盖ICreatable<Button>
。
编辑:
经过一番讨论后,我已经用#define
方法将这些方法缩短为一行:
#define InsertCreatableMethods(T) \
static std::shared_ptr<T> create() {\
return std::shared_ptr<T>(new T());\
}\
static std::shared_ptr<T> inflate(AttributeSet* attrs) {\
return std::shared_ptr<T>(new T(attrs));\
}
//...
class Button : public View {
//...
public:
InsertCreatableMethods(Button)
//...
}
上面的代码是达到我想要的最佳方式(嗯,我认为最懒惰的方式)。
答案 0 :(得分:0)
如果您按如下方式编写IView
:
template <class T>
class View : public ICreatable<T>
您可以将按钮写为:
template <class T>
class Button : public View<T>
不需要双重继承。 如果你有另一个
class RadioButton : public Button<RadioButton>
一般来说,拥有深度继承树并不是一件好事。中间叶应该是抽象的。 Button
没有具体含义。只有RadioButton
。更好的设计看起来像:
template <class T>
class IView : public ICreatable<T>
class View : public IView<View>
template <class T>
class IButton : public IView<T>
class Button : public IButton<Button>
这种方式没有双重继承,每个类都为每个类都有一个简单的继承树。