Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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#_Oop_Inheritance_Overriding - Fatal编程技术网

C# 是否可以重写隐藏的方法?

C# 是否可以重写隐藏的方法?,c#,oop,inheritance,overriding,C#,Oop,Inheritance,Overriding,假设我有以下层次结构: public class MyClass { protected virtual void Method() { ... } } public class MySubClass : MyClass { public new virtual void Method() { ... } } public class MySubSubClass : MySubClass { // how do I reference the protected Method()

假设我有以下层次结构:

public class MyClass
{
  protected virtual void Method() { ... }
}

public class MySubClass : MyClass
{
  public new virtual void Method() { ... }
}

public class MySubSubClass : MySubClass
{
  // how do I reference the protected Method() to override it?
}
是否可以覆盖受保护的
方法()的实现,以便将MyClass中定义的其他方法的调用分派到MySubClass中的实现

如果不可能的话,最好能了解原因。

是的。您可以使用“new”关键字重新引入您想要的任何方法。从那时起,对“newed”方法的每个调用都将被发送到新的实现


在这种情况下,任何对
Method()
的调用源自
MyClass
都将使用
mysubclass
实现,只要所讨论的对象类型为
mysubclass

,如果您试图覆盖
MyClass
中定义的方法版本,那么答案是您不能。
MySubClass
中的定义对您隐藏了此实现,您无法进一步覆盖它

正如@Jared所说,你不能。我只能假设您试图避免再次使用
new
,因为您需要正确的
virtual
处理。要处理这一问题,唯一的方法是去掉
Method()
public-new
版本,并将其命名为其他名称
new
完全隐藏祖先对象中可能存在的要重新声明的方法的任何版本。

如果将隐藏方法标记为虚拟方法,则可以覆盖隐藏方法:

public new virtual void Method()

你的方法需要类型;另外,我可能误读了描述,但您只是在寻找override关键字吗?我尝试了
protected override void Method()
,这会导致“无法更改访问权限”和“已声明具有相同签名的方法”的语法错误。我还尝试了接口样式
protected override void MyClass.Method()
,这会导致三种不同的语法错误。@Matt谢谢,更新了示例。愚蠢的后续操作?如果他正在覆盖它,那么他从哪个位置替换它有关系吗?因为他正在替换它?@Matt:是的,尽管名称相同,但它们是两个非常不同的函数。如果您调用
((MyClass)this.Method()
它将运行与
this.Method()
不同的代码。他只能在MyClass中隐藏该方法,而不能覆盖它-如果MySubClass的实例被强制转换为MyClass,那么调用的方法()只能是MyClass中的方法,它不会被虚拟调度给您。对于为什么不可能进行显式接口样式重写,您有什么解释吗?这是OOP“哲学”的结果吗?@gWiz,IIRC这是CLR限制,所以它不是C可以控制的设计决策。我不确定我是否在跟随你。我知道我可以使用
new
重新定义特定的方法名。我是在我的班上做的。但是,由于它是新的,MyClass没有意识到它,也不会发送给它。谢谢,在阅读Jared的答案后,将MySubClass重命名。方法与我得出的结论相同。顺便说一句,我并不是想避开新的
。我不确定再次使用
new
会有什么帮助。我只想更改超类中被超类隐藏的方法的实现。