我的理解是,子类的行为与父类完全相同,除了其他方法或使用override
和class BIG
protected void Output(string text = "")
Console.WriteLine("BIG - " + text);
public void CallingOutput()
Output("Outputting...");
class SMALL:BIG
public new void Output(string text = "")
Console.WriteLine("SMALL - " + text);
class Program
static void Main(string[] args)
SMALL foo = new SMALL();
关键字“重写”的方法。显然,这不正确。
请参阅下面的代码(为了便于阅读,删除了括号)
BIG.Output(string)
我已经知道我可以使用new
关键字隐藏SMALL中的>> foo.Output("Outputting...")
SMALL - Outputting...
。直接打电话时,效果很好。
class SMALL:BIG
这与我的理解相冲突。我认为定义class SMALL
与定义class SMALL
public void Output(string text = "")
Console.WriteLine("SMALL - " + text);
public void CallingOutput()
Output("Outputting...");
并从BIG复制粘贴所有方法完全相同。简而言之,我认为上面的SMALL类等同于:
>> foo.CallingOutput()
BIG - Outputting...
显然这是不正确的,因为
Output(string)
当间接调用时,它仍在使用BIG
中的原始foo.CallingOutput()
。
这样做的正确方法是"SMALL - Outputting..."
输出
BIG
假设我无法访问CallingOutput()
并且不允许进行任何更改。我也不想隐藏CallingOutput()
,因为这基本上是重写了类。
(是的,隐藏C++
使其有效)
我在发布之前做了一些搜索,并在I am travelling from London to New York.
I am flying to Sydney from Singapore.
中找到了类似的问题。但是,答案是不可能的。
答案 0 :(得分:0)
将new
替换为override
,如下所示:
class SMALL:BIG
public override void Output(string text = "")
Console.WriteLine("SMALL - " + text);
答案 1 :(得分:0)
除非设计为被覆盖,否则您无法修改或覆盖现有类中的任何内容。这是设计的。
话虽这么说,你可以创造一个新的" shim" (pass-through)类与原始类完全相同,但成员被声明为virtual。这是通过使用new
和virtual
修饰符来完成的。
获得垫片类后,您可以按正常方式覆盖该方法。例如:
class Big
{
public void Output(string text) { Console.WriteLine("Big - {0}", text); }
public void CallingOutput()
{
Output("Outputting...");
}
}
class Shim : Big
{
public new virtual void Output(string text) { base.Output(text); }
public void CallingOutput()
{
Output("Outputting...");
}
}
现在你有了一个允许你想要的Shim类。所以将它子类化(而不是Big)并看看会发生什么:
class Small : Shim
{
public override void Output(string text) { Console.WriteLine("Small - {0}", text); }
}
测试它:
Shim s = new Shim();
s.CallingOutput(); //Original behavior
Shim s = new Small();
s.CallingOutput(); //Overridden behavior
输出:
Big - Outputting...
Small - Outputting...