如何使用泛型创建实例?

时间:2015-07-30 14:21:54

标签: c# generics

我正在尝试做一些简单的事情:用泛型创建一个实例。我收到一条错误消息,说我无法创建实例,因为我没有#include "hidabletabwidget.h" #include <QTabBar> #include <QToolButton> HidableTabWidget::HidableTabWidget(QWidget *parent) : QTabWidget(parent), hideAction("▾", this) { hideAction.setCheckable(true); hideAction.setToolTip("Hide Panels"); QToolButton* hideButton = new QToolButton(); hideButton->setDefaultAction(&hideAction); hideButton->setAutoRaise(true); this->setCornerWidget(hideButton); connect(&hideAction, SIGNAL(toggled(bool)), this, SLOT(onHideAction(bool))); connect(this, SIGNAL(tabBarClicked(int)), this, SLOT(onTabBarClicked())); } void HidableTabWidget::onHideAction(bool checked) { if (checked) { this->setMaximumHeight(this->tabBar()->height()); this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); } else { this->setMaximumHeight(100000); // just a very big number this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); } } void HidableTabWidget::onTabBarClicked() { hideAction.setChecked(false); } 约束。但是,我在退货声明中确实有这个!有什么想法吗?

new

2 个答案:

答案 0 :(得分:5)

您必须在new()类型参数上指定TA约束才能调用构造函数:

public IAction CreateAction<TA, TP>(ActionParamBase param)
        where TA : IAction
                 , new()
        where TP : ActionParamBase
    {
        ...
    }

只有这样才能知道(并强制)TA具有无参数构造函数。

(只是一个小小的注释:它只适用于无参数构造函数,而不适用于具有参数的构造函数。在这种情况下,您可以使用初始化函数)

答案 1 :(得分:3)

这意味着在你的TA部分约束中有new。请参阅此SO帖子以供参考,然后查看以下代码: Passing arguments to C# generic new() of templated type

public IAction CreateAction<TA, TP>(ActionParamBase param)
        where TA : IAction, new()
        where TP : ActionParamBase
    {
        Ensure.That(param).Is<TP>();

        return new TA { Param = param as TP };
    }