当前位置: 首页 > 编程语言 > C#

在C#的接口中使用时,“new”关键字的含义是什么?Share

时间:2023-04-10 14:57:56 C#

在C#的接口中使用时,“new”关键字的含义是什么?开发通用接口我希望在接口中声明一个构造函数,但它说那里禁止使用构造函数。我试图声明一个静态工厂方法,但它说不允许使用静态方法并建议使用“new”关键字。但我几乎不知道在C#中使用接口时“new”关键字的实际含义。你呢?更新:我没有发布任何示例代码,因为我不想混淆两个问题——如何在接口中指定构造函数/工厂以及“new”关键字在接口中的含义。II甚至被迫只指定第一部分,因为StackOverflow不接受纯形式的第二个问题,说它不符合质量标准。但是,正如您所要求的,我将对我试图实现的目标进行抽样:InterfaceIMyInterface{IMyInterface(T,U,U);//或者staticIMyInterfaceGetNewIMyInterface(T,U,U);我只希望每个派生类都实现这样一个构造函数。new关键字告诉编译器您的定义隐藏了接口中包含的定义,该接口可以扩展该接口。Bala的回答是正确的,但它可能有助于了解您为什么要这样做。考虑BCL设计者在为CLR版本2设计库时面临的问题。现有接口:interfaceIEnumerable{IEnumeratorGetEnumerator();现在你添加:interfaceIEnumerable:IEnumerable{newIEnumeratorGetEnumerator();}新接口在返回类型上与旧接口不同。你有什么选择?1)将新的GetEnumerator标记为“新”,这样编译器就知道它是一个新方法,并且不会与具有相同名称但返回类型不同的旧方法发生冲突。2)将名称更改为GetEnumerator2。3)不要继承原来的IEnumerable。选项2和3糟透了。选项1很棒:新枚举与期望旧枚举的代码无缝协作,但使用新枚举编写的代码默认获得“新”通用行为。您不能在接口中指定构造函数或静态方法...您可以做的是为泛型类型参数添加类型约束,例如voidFoo()whereT:new(){Tt=newT();//用t做事}你在想什么?接口应该指定契约。它只包含方法签名而不包含实现。接口不能直接实例化,所以接口中不允许有构造函数。http://msdn.microsoft.com/en-us/library/87d83y5b(v=vs.80).aspx你正在使用一个接口,但听起来你想要一个基类。接口永远不需要构造函数,因为它不能包含任何需要在构造函数中初始化的字段。我想你想使用基类。C#和.NET不允许您在接口上声明构造函数。它只是实现该接口的明确约束(请参阅.NET库中的ISerializable)。如果您考虑一下,在接口上使用构造函数是没有意义的,因为在调用构造函数时您必须知道要创建的具体类。您将如何调用这样的接口构造函数,结果如何?首先,“new”关键字真正做的唯一事情就是告诉编译器不要生成警告,告诉你应该使用“new”关键字。关键字本身除了消除警告外什么都不做(在上下文中)。编译器现在要求您在重新定义已在继承接口中定义的成员(属性或方法)时使用“new”关键字,这至少有两个可能的原因。首先,正如EricLippert上面提到的,您可能希望该方法返回不同的类型(或者定义一个具有不同类型的同名属性)。另一种可能性是,如果您想为两个接口定义不同的实现:interfaceA{voida();}接口B:A{newvoida();}classC:B{voidAa(){Console.WriteLine("CalledbyinterfaceA!");}voidBa(){Console.WriteLine("由接口B调用!");}}staticclassTest{publicstaticvoidDoTest(){Bb=newC();巴();//产生“由接口B调用!”((A)b).a();//产生“由接口A调用!”如果您尝试在C中定义Ba()并且不在B中重新定义a(),您将收到一条警告,指出它不是接口的成员:显式接口声明要求您使用接口其成员已明确定义。以上是C#学习教程:在C#中的界面中使用'new'关键字是什么意思?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: