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

分享_113

时间:2023-04-10 17:53:08 C#

C#中的'new'修饰符的使用C#中的'new'修饰符的使用我读到new修饰符隐藏了基类方法。使用系统;A类{publicvoidY(){Console.WriteLine("AY");}}classB:A{publicnewvoidY(){//此方法隐藏AY//它仅通过B类型引用调用。安慰。写行(“按”);}}classProgram{staticvoidMain(){Aref1=newA();//不同的newAref2=newB();//多态性Bref3=newB();ref1.Y();ref2.Y();//产生AY线#xxref3.Y();为什么ref2.Y();生产AY作为输出?这就是简单的多态,基类对象指向派生类,所以应该调用派生类的函数。我实际上是一名Java兼C#编码员;这些概念让我大吃一惊。当我们说new隐藏基类函数的时候,意思就是不能调用基类函数,据我所知hidden就是这个意思。默认情况下,REF方法在C#中不是虚拟的(与Java不同)。因此,ref2.Y()方法调用不是多态的。要从多态性中受益,您应该将AY()方法标记为虚拟方法并将BY()方法标记为覆盖。new修饰符所做的只是从基类继承中隐藏成员。这就是Main()方法中真正发生的事情:Aref1=newA();Aref2=newB();Bref3=新B();ref1.Y();//AYref2.Y();//AY-调用隐藏方法,无多态性ref3.Y();//BY-调用新方法(只是为了补充其他答案和我自己的评论。)使用new时,一个类(或结构或接口)将有两个相同的成员,一个继承自基类型,另一个由自己打字。避免这个!重要说明:仅仅因为您说的是新成员,您并没有“删除”旧成员。它仍然存在并且可以轻松调用。新成员不会取代继承的成员。这是一个不相关的成员,恰好具有相同的名称。在一个看起来相同的类型中有两个或更多成员是不好的。这会导致混乱。考虑代码:interfaceIOne{voidY();}接口ITwo{voidY();}interfaceIBoth:IOne,ITwo{}classTest{staticvoidM(IBothobj){obj.Y();//不能编译!}}IBoth类型有两个看起来相同的成员(都是继承的)。根据具体的类obj,这些方法可能有不同的实现。调用obj.Y()是不明确的。您必须使obj成为基本接口之一才能解决此问题。然后考虑这段代码:interfaceIBase{voidY();}interfaceIDerived:IBase{/*new*/voidY();}classTest{staticvoidM(IDerivedobj){obj.Y();//允许;IDerived有两个Y,但一个隐藏了另一个}}这一次,有两个Y(),但一个比另一个“更近”。所以越近越好。但是,如果不使用new,编译器会给出警告。如果你确实使用new,除了让编译时警告消失之外,什么都不会改变。故意制作两个Y()确实是个坏主意。如果基类型(这里是IBase)是由另一个供应商/供应商编写的,就会发生这种情况。示例:当基类没有该功能时,您可能已经在界面中引入了Y()。但随后IBase的供应商发布了他们产品的新版本,其中IBase具有Y()。现在,如果您针对新版本编译代码,“您的”Y()仍将被调用,而不是他们的。但它给出了这个警告。如果您包括新的警告消失。但是,如果您确定供应商的Y()完成了工作,或者(2)将Y()方法重命名为某个未使用的名称,则最好(1)完全删除Y()方法。如果您想要的是多态性,当然可以使用抽象/虚拟(仅在类成员中)和覆盖(在继承类中)。override不引入任何新成员,只是现有(继承)成员的新实现。这只能对非静态成员(通常是方法或属性)完成。对象的类型是A,但ref2不会访问类B中定义的Y()版本,因为该方法是使用new修饰符而不是override修饰符声明的。因此,ref2对象显示与A对象相同的描述。以上就是C#学习教程:C#中'new'修饰符的使用,分享全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: