加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 有没有办法在没有通用约束的情况下强制执行无参数构造函数

发布时间:2020-12-15 18:31:51 所属栏目:百科 来源:网络整理
导读:我有一个接口ISnack,当由类实现时,它应该有一个默认的无参数构造函数.基本上这个: public interface ISnackT where T : new(){} 我使用 T其中T:new()只是为了强制执行无参数构造函数. 然后我会以这种方式实现接口: public class Cutlet : ISnackCutlet{}
我有一个接口ISnack,当由类实现时,它应该有一个默认的无参数构造函数.基本上这个:
public interface ISnack<T> where T : new()
{

}

我使用< T>其中T:new()只是为了强制执行无参数构造函数.

然后我会以这种方式实现接口:

public class Cutlet : ISnack<Cutlet>
{

}

这有效,它只是确保Cutlet类具有无参数构造函数.

现在我有一个抽象基类Kitchen:

public abstract class Kitchen<T> where T : ISnack
{

}

要求是Kitchen应该有一个约束,其中T应该是一个ISnack.但这不起作用,因为不存在ISnack,而只有ISnack< T>.

如果我试过这个

public abstract class Kitchen<T> where T : ISnack<T>
{

}

它不会编译(‘T’必须是具有公共无参数构造函数的非抽象类型,以便在泛型类型或方法’ISnack< T>‘中将它用作参数’T’)并且也不会在我的背景下感觉.

如果我可以强制ISnacks具有无参数构造函数而不受T类型参数的约束,那么厨房中的T< T>很容易成为一个ISnack.怎么去呢?

解决方法

除非添加约束,否则不能;泛型约束是累积的,因此要使编译器满意,您必须具有:
public abstract class Kitchen<T> where T : ISnack<T>,new()

如果没关系,那就去做吧.如果它不好,那么你将不得不从原版中删除:new,并且不使用它.这并不像听起来那么糟糕,但它意味着您将验证推送到执行而不是编译.但是:即使没有new()约束,Activator.CreateInstance< T>()仍然会做你需要的东西.所以你可以替换:

T newObj = new T(); // validated by the compiler

有:

T newObj = Activator.CreateInstance<T>(); // not validated until executed

删除约束时的一个方便技巧可以是:添加通过反射查找候选类型的单元/集成测试,并将缺少的约束验证为测试套件的一部分.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读