0

我正在开发自己的 WinAPI 包装库,它负责处理与 GUI 相关的所有内容。我在 Android 平台上看到了一些移植的解决方案(视图、测量/布局/绘制通道、从 XML 中“膨胀”UI)。

现在:我不想重复自己并手动添加静态方法,例如 create 和 inflate 到每个ViewButtonGridViewTextView)。

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现在我必须以某种方式处理歧义 - Button 具有ICreatable ,其中 View 和 Button 都作为 T 传递。我想ICreatable<View>ICreatable<Button>.

  • 这在 C++ 中是否可行?
  • 如果没有,是否有另一种方法可以实现这种“自动静态方法添加”?
  • 我应该回到我的第一个(可怕的)想法,即为每个视图手动添加静态 create() 和 inflate() 方法吗?

编辑:经过一番讨论,我已经#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)
    //...
}

上面的代码是实现我想要的最好的方式(嗯,我认为是最懒惰的方式)。

4

1 回答 1

0

如果你写IView如下:

template <class T>
class View : public ICreatable<T>

您可以将按钮编写为:

template <class T>
class Button : public View<T>

并且不需要双重继承。如果你有另一个

class RadioButton : public Button<RadioButton>

一般来说,拥有深度继承树并不是好的设计。中间叶子应该是抽象的。AButton没有具体含义。只有一个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>

这样就没有双重继承,每个类都有一个简单的继承树。

于 2015-04-20T18:45:33.827 回答