假设我们有一个抽象STYLESHEET = '''QTreeWidget {border:None}
QTreeWidget::Item {height: 80px;
border-bottom:2px solid black;
color: rgba(255,255,255,255);} /* +++ */
QTreeView {
alternate-background-color: rgba(170,170,170,255);
background: rgba(211,211,211,255);}'''
self.treeWidget = QTreeWidget()
self.treeWidget.setAlternatingRowColors(True)
self.treeWidget.setStyleSheet(STYLESHEET)
,它具有多个子类。每个具体的类(不是对象)都有一个与之关联的优先级。存储此优先级的一种方法就是简单地作为class A
中的protected int prio
。
但是如何确保每个子类确实为A
设置一个值?
我能想到的唯一方法是使用模板化并将优先级作为类型的一部分。我希望有一种更轻量级的方法。
答案 0 :(得分:2)
我没有找到一种方法来确保在子容器中初始化非静态数据成员。维护具有相同含义的不同静态数据成员也很棘手,而且容易出错。因此,我建议使用一个纯虚函数动态获取子类的优先级。纯虚拟确保子类必须重写此getter:
class Base {
public:
void print() const { std::cout << "prio: " << getPrio() << std::endl; }
protected:
virtual int getPrio() const = 0;
};
class Sub1 : public Base {
int getPrio() const override { return 1; }
};
class Sub2 : public Base {
int getPrio() const override { return 2; }
};
int main()
{
Sub1 s1;
Sub2 s2;
s1.print();
s2.print();
return 0;
}
答案 1 :(得分:0)
最简单的方法是使用经典替代。相同类别的优先级始终相等。
sbt shell
答案 2 :(得分:0)
存储此优先级的一种方法就是将其存储为
protected int prio
中的A
。
那是行不通的。
如果您使用
static int prio;
A
及其所有子类中只有一个变量。
如果您使用
int prio;
每个实例都将其作为成员变量,这违背了为每个类创建值的目的。
您可以使用以下策略来最小化样板代码。
class A { ... };
template <typename T>
struct PriorityHolder
{
static int prio;
};
template <typename T>
int PriorityHolder<T>::prio = <Find a suitable method for value>;
class Derived1 : public A,
public PriorityHolder<Derived1>
{
...
};