防止C#子类重写方法假设我有一个名为“Parent”的抽象父类,它实现了一个名为“DisplayTitle”的方法。我希望此方法对于继承“Parent”的每个子类都是相同的-如果子类尝试实现自己的“DisplayTitle”方法,我希望编译错误。我怎样才能在C#中实现这一点。我相信Java,我只是将方法标记为“final”,但我似乎无法在C#中找到替代方法。我一直在摆弄“密封”和“覆盖”,但我无法获得我正在寻找的行为。例如,在这段代码中:usingSystem;namespaceConsoleApplication1{classParent{publicvoidDisplayTitle(){Console.WriteLine("Parent'sTitle");}}classChildSubclass:Parent{publicvoidDisplayTitle(){Console.WriteLine("孩子自己实现的标题");}staticvoidMain(string[]args){ChildSubclassmyChild=newChildSubclass();myChild.DisplayTitle();控制台.ReadLine();我想得到一个编译错误,说“ChildSubClass”不能覆盖“DisplayTitle”。我目前收到警告-但似乎这是我应该能够做的事情,而且我不知道标记该方法的正确属性。我怎样才能在C#中实现这一点。我相信Java,我只是将方法标记为“final”,但我似乎无法在C#中找到替代方法。粗略的等价物在C#中是密封的,但通常只有虚拟方法才需要它——而您的DisplayTitle方法不是虚拟的。重要的是要注意ChildSubclass不会覆盖DisplayTitle-它会隐藏它。任何仅使用对Parent的引用的代码都不会最终调用该实现。请注意,按原样使用代码,您应该会收到编译时警告,建议您将新修饰符添加到ChildSubclass的方法中:publicnewvoidDisplayTitle(){...}您不能阻止派生类隐藏现有方法,除了通过密封类本身以完全阻止派生类的创建……但是不直接使用派生类型的调用者无关紧要。你真正担心的是什么?意外误用还是故意问题?编辑:请注意示例代码有一个警告类似于:Test.cs(12,19):warningCS0108:'ConsoleApplication1.ChildSubclass.DisplayTitle()'hidesinheritedmember'ConsoleApplication1.Parent.DisplayTitle()'。如果打算隐藏,请使用new关键字。我建议你把警告变成错误,这样就更难忽略它们了:)派生类不能覆盖你的方法,你没有声明它是虚拟的。请注意C#与Java相比有何不同,所有方法都是Java中的虚拟方法。在C#中,您必须显式使用关键字。派生类可以通过再次使用相同的名称来隐藏您的方法。这可能是您正在谈论的编译警告。使用new关键字可以抑制警告。这个方法不会以任何方式覆盖原来的方法,基类代码总是调用原来的方法,而不是派生类中的方法。使用sealed修饰符可防止子类覆盖您的类、属性或方法。使用密封件时什么不起作用?http://msdn.microsoft.com/en-us/library/88c54tsw.aspx我很确定在C#中使用方法修饰符关键字不可能实现您想要的。密封仅在覆盖祖先类中的虚拟方法时适用,然后防止进一步覆盖。以上就是C#学习教程:防止C#子类重写方法的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
