草庐IT

overriding

全部标签

c# - 为什么 C#/CLR 不支持方法重写协方差/反方差?

关于绕过C#不允许方法返回(和参数)类型被更改为兼容类型的覆盖的限制,有很多问题和答案,但是为什么存在这个限制,在C#编译器中还是在CLR中?如我所见,如果允许协方差/协方差,就没有什么可以破坏的,那么它背后的原因是什么?类似的问题可能会被问到扩大访问参数——例如用公共(public)方法覆盖protected内部方法(Java支持的东西,IIRC) 最佳答案 这个答案不是在谈论C#,但它帮助我更好地理解了问题,也许它会对其他人有所帮助:Whyistherenoparametercontra-varianceforoverridin

c# - 何时使用 new 而不是重写 C#

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:C#keywordusagevirtual+overridevs.newDifferencebetweennewandoverride?所以我一直在做一个项目,并决定阅读一些有关C#中new和override关键字之间的区别的文章。据我所知,似乎使用new关键字功能是在代码中制造错误的好方法。除此之外,我真的看不出什么时候使用它才真正有意义。更多的是出于好奇,是否有任何模式可以让new关键字成为正确的方式?

c# - 具有覆盖属性和反射的奇怪效果

我在.NET/Reflection中遇到了一个奇怪的行为,找不到任何解决方案/解释:classA{publicvirtualstringTestString{get;set;}}classB:A{publicoverridestringTestString{get{return"x";}}}由于属性只是函数对(get_PropName()、set_PropName()),因此仅覆盖“get”部分应该保留“set”部分在基类中。如果您尝试实例化B类并为TestString赋值,就会发生这种情况,它使用A类的实现。但是如果我在反射中查看类B的实例化对象会发生什么:PropertyInfop

c# - 隐式 (bool) 和 == 运算符覆盖 - 正确处理 if 语句

我有一个自定义类,它实现了bool运算符的==和implicit。这是处理所有可能的if==/!=语句并获得预期结果的正确方法吗?像这样:publicclassFoo{publicboolResult{get;set;}publicstaticbooloperator==(bool@bool,Foofoo){returnEquals(foo,@bool);}publicstaticbooloperator!=(bool@bool,Foofoo){returnNotEquals(foo,@bool);}publicstaticbooloperator==(Foofoo,bool@bool

c# - 什么时候应该覆盖 OnEvent 而不是在继承时订阅事件

什么时候应该做以下事情?classFoo:Control{protectedoverridevoidOnClick(EventArgse){//newcodehere}}与此相反?classFoo:Control{publicFoo(){this.Click+=newEventHandler(Clicked);}privatevoidClicked(objectsender,EventArgse){//code}} 最佳答案 覆盖而不是附加委托(delegate)将产生更高效的代码,因此通常建议您始终尽可能这样做。有关详细信息,请参

C# 设计 : Why is new/override required on abstract methods but not on virtual methods?

为什么抽象方法需要new/override而虚方法不​​需要?示例1:abstractclassShapesClass{abstractpublicintArea();//abstract!}classSquare:ShapesClass{intx,y;publicintArea()//Error:missing'override'or'new'{returnx*y;}}编译器会显示这个错误:要使当前成员覆盖该实现,请添加override关键字。否则添加新关键字示例2:classShapesClass{virtualpublicintArea(){return0;}//itisvirt

c# - 是否可以使用派生参数而不是基本参数来覆盖方法?

我陷入了这种情况:我有一个名为Ammo的抽象类,其中有AmmoBox和Clip作为子类。我有一个名为Weapon的抽象类,Firearm和Melee作为子类。Firearm是抽象的,ClipWeapon和ShellWeapon作为子项。在Firearm里面,有一个voidReload(Ammoammo);问题是,ClipWeapon可以同时使用Clip和AmmoBox来装弹:publicoverridevoidReload(Ammoammo){if(ammoisClip){SwapClips(ammoasClip);}elseif(ammoisAmmoBox){varammoBox=a

c# - 派生的 C# 接口(interface)属性是否可以覆盖同名的基本接口(interface)属性?

我正在尝试创建一个接口(interface)继承系统,该系统使用相同的属性但始终具有进一步派生的类型。因此,基本属性应该以某种方式被派生接口(interface)覆盖或隐藏。例如,派生到Husband和Wife的两个接口(interface)Man和Woman也是接口(interface)。Man和Husband接口(interface)都有一个“sweetheart”属性,而Woman和Wife有一个“darling”属性。现在,Man的“sweetheart”属性是Woman类型,而Husband的同一个“sweetheart”属性应该是Wife(派生自Woman)。女人和妻子的“

c# - 内部抽象方法。为什么会有人拥有它们?

我今天正在做一些代码审查,发现了一些开发人员编写的旧代码。事情是这样的publicabstractclassBaseControl{internalabstractvoidDoSomething();}如果在同一个程序集中有一个派生类,它就可以工作publicclassDerivedControl:BaseControl{internaloverridevoidDoSomething(){}}但是在不同的程序集中派生基类会产生编译时错误DerivedControldoesnotimplementinheritedabstractmember'BaseControl.DoSomethin

c# - "override"枚举的最佳方法是什么?

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:Enum“Inheritance”我有许多扩展抽象类的类。抽象父类定义了一个具有一组值的枚举。一些子类继承父类的枚举值,但一些子类需要枚举值不同。有什么方法可以以某种方式覆盖这些特定子类的枚举,如果没有,实现我所描述的内容的好方法是什么?classParentClass{privateMyEnumm_EnumVal;publicvirtualMyEnumEnumVal{get{returnm_EnumVal;}set{m_EnumVal=value;}}publicenumMyEnum{a,b,c};}cla