【发布时间】:2013-01-22 15:10:20
【问题描述】:
我想知道方法隐藏在 c# 中如何有用?如果你深入了解这个概念,你会发现方法隐藏是一件令人困惑的事情,并驱使我们采用意大利面条代码风格。其中有一些原因:
1-如果您在派生类中需要一个新方法,您可以在派生类中定义一个具有新名称的新方法。
2-以多态方式使用向上转换时,将无法实现预期的行为,这可能会造成混淆。
(特别是如果基类和派生类位于不同的库中并且您希望在代码中的某个位置对它们进行多态使用,那么这种奇怪的行为可能会非常明显和明显)
class Base
{
public void Method() { Console.WriteLine("I am Base Class"); }
}
class Derived: Base
{
public new void Method() { Console.WriteLine("I am Derived Class");}
}
class Program
{
static void Main(string[] args)
{
Base C = new Derived();
C.Method(); //output:"I am Base Class"
}
}
这样的行为可能会令人困惑,但是如果我们在“Base”中使用“virtual”,在“”中使用“override” >Derived”(我的意思是多态用法)输出是:“I am Derived Class”。 这个输出是我认为我们大多数人所期望的。
换句话说,我相信在层次结构中,大多数开发人员期望在派生类中重写方法而不是想要隐藏基类实现的新方法。
我不明白为什么在c#语言中有这么一个没有优势的坏东西?至少我想知道隐藏在 c# 中的方法的最佳用法是什么?
感谢您的帮助
【问题讨论】:
-
“无法实现预期行为” - 这取决于开发人员的预期。如果他期望非虚拟方法以虚拟方式运行,那是一个有缺陷的期望。
-
这里有一个例子:如果你有一个 Animals 的集合,并且遍历集合以在每个 Animal 上调用 Speak(),你不希望 Cows 说“Moo”而 Dogs 说“汪”?
-
@mbeckish 这是您确实需要虚拟方法的人为情况。一个反例并不能否定整个功能。
-
我不确定您是否正确使用了“方法隐藏”一词。您的代码示例是方法隐藏的示例。如果该方法是虚拟的,那么它将是方法覆盖。你说哪个不是好东西?
标签: c# methods method-hiding