Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止C#子类重写方法_C#_Object_Inheritance - Fatal编程技术网

防止C#子类重写方法

防止C#子类重写方法,c#,object,inheritance,C#,Object,Inheritance,假设我有一个名为“parent”的抽象父类,它实现了一个名为“DisplayTitle”的方法。我希望这个方法对于继承“Parent”的每个子类都是相同的——如果子类试图实现自己的“displaytile”方法,我希望出现编译错误。我如何在C#中实现这一点。我相信Java,我只是将该方法标记为“final”,但在C#中似乎找不到替代方法。我一直在胡闹“密封”和“覆盖”,但我找不到我想要的行为 例如,在此代码中: using System; namespace ConsoleApplicatio

假设我有一个名为“parent”的抽象父类,它实现了一个名为“DisplayTitle”的方法。我希望这个方法对于继承“Parent”的每个子类都是相同的——如果子类试图实现自己的“displaytile”方法,我希望出现编译错误。我如何在C#中实现这一点。我相信Java,我只是将该方法标记为“final”,但在C#中似乎找不到替代方法。我一直在胡闹“密封”和“覆盖”,但我找不到我想要的行为

例如,在此代码中:

using System;

namespace ConsoleApplication1
{
  class Parent
  {
      public void DisplayTitle() { Console.WriteLine("Parent's Title"); }
  }

  class ChildSubclass : Parent
  {
      public void DisplayTitle() { Console.WriteLine("Child's Own Implementation of Title"); 
  }

    static void Main(string[] args)
    {
        ChildSubclass myChild = new ChildSubclass();
        myChild.DisplayTitle();
        Console.ReadLine();
    }
  }
}

我希望收到一个编译错误,说明“ChildSubClass”无法覆盖“DisplayTitle”。我目前收到了一条警告——但这似乎是我应该能够做到的,我不知道标记该方法的正确属性。

使用密封修饰符防止子类重写您的类、属性或方法。当您使用密封时,什么不起作用

我如何在C#中实现这一点。我相信Java,我只是将该方法标记为“final”,但在C#中似乎找不到替代方法

粗略的等价物是C#中的
sealed
,但您通常只在虚拟方法中需要它,而您的
DisplayTitle
方法不是虚拟的

需要注意的是,
ChildSubclass
并没有覆盖
DisplayTitle
——而是隐藏了它。任何只使用对
Parent
的引用的代码最终都不会调用该实现

注意,如果代码保持原样,您应该会收到编译时警告,建议您在
ChildSubclass
中的方法中添加
new
修饰符:

public new void DisplayTitle() { ... }
您无法阻止派生类隐藏现有方法,除非通过密封类本身来完全阻止创建派生类。。。但是不直接使用派生类型的调用方不会在意

你真正关心的是什么?意外误用,还是故意的问题

编辑:请注意,示例代码的警告类似于:

Test.cs(12,19): warning CS0108:
        'ConsoleApplication1.ChildSubclass.DisplayTitle()' hides inherited
        member 'ConsoleApplication1.Parent.DisplayTitle()'. Use the new keyword
        if hiding was intended.

我建议您将警告转化为错误,然后很难忽略它们:)

派生类无法重写您的方法,您没有将其声明为虚拟。请注意,与Java相比,C语言中的这一点非常不同,Java中的所有方法都是虚拟的。在C#中,必须显式使用关键字


派生类可以通过再次使用相同的名称来隐藏方法。这可能就是您所说的编译警告。使用new关键字将抑制警告。此方法不会以任何方式覆盖原始方法,基类代码总是调用原始方法,而不是派生类中的方法。

我相当确定,在C中使用方法修饰符关键字不可能实现您想要的


Sealed仅在重写祖先类中的虚拟方法时适用,这将阻止进一步重写。

当我使用“public Sealed void displaytile(){Console.WriteLine(“父标题”);}”时,我收到一个编译错误-“'ConsoleApplication1.Parent.displaytile()'不能被密封,因为它不是重写”.我想我真正关心的是意外误用。我在另一个项目中有一个抽象类,它有一个“打开”和“关闭”方法。不需要太多细节,这个类将多次成为子类来表示真实世界的对象。但是,所有这些设备都将以相同的方式打开和关闭。我只是不希望自己或其他人在没有某种类型的警告的情况下,尝试为单个设备执行自己的关闭/打开命令。@user1720817:当然会有警告。我会将示例代码中的警告编辑到我的答案中…是的,有一个警告:)正是我的OCD让我希望它是一个编译时错误。谢谢你花时间写这篇文章+1对于将警告转化为错误,我在java中对handle importsGood point做了相同的操作,但OP希望通过继承类来防止隐藏基方法。这是不可能的。我想这似乎是最让我困惑的一部分-为什么我可以密封一个继承的方法,但不能在“基类”中执行它?@MichaelSallmen,我说过“你想要的是不可能的”,你的困惑在哪里?