【发布时间】:2010-11-19 12:06:42
【问题描述】:
我有一个由某些工具生成的类,因此我无法更改它。生成的类很简单(没有接口,没有虚方法):
class GeneratedFoo
{
public void Write(string p) { /* do something */ }
}
在 C# 项目中,我们希望提供一种方法,以便我们可以插入不同的 MyFoo 实现。所以我正在考虑让 MyFoo 派生自 GeneratedFoo
class MyFoo : GeneratedFoo
{
public new void Write(string p) { /* do different things */ }
}
然后我有一个 CreateFoo 方法,它将返回 GeneratedFoo 或 MyFoo 类的实例。但是它总是调用 GeneratedFoo 中的方法。
GeneratedFoo foo = CreateFoo(); // if this returns MyFoo,
foo.Write("1"); // it stills calls GeneratedFoo.Write
这是预期的,因为它不是虚拟方法。但我想知道是否有办法(可能是 hack)让它调用派生方法。
谢谢,
伊恩
【问题讨论】:
-
"公共新无效" ?那是我以前从未见过的“新”的用法。这还有效吗?
-
'new' 在这里表示,您已经从基类中明确地“覆盖”了方法,而没有覆盖它(因为它不是虚拟的) - 没有它,您实际上会收到编译器的警告。
-
更具体地说 - 当您在派生类中为您的方法提供与基类中相同的名称,并且它不是覆盖方法时,编译器会给您一个警告,您的方法隐藏了继承的成员(因为您可能不想这样做),但如果你确定,你可以使用“new”关键字告诉编译器。
-
当关键字被重载以根据上下文具有多种含义时,我总是很兴奋。谢谢你让我直截了当。
标签: c# class inheritance