【发布时间】:2018-10-15 11:40:34
【问题描述】:
我的理解是,子类的行为与父类完全相同,除了附加方法或使用new 和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();
我已经知道可以使用 new 关键字将 BIG.Output(string) 隐藏在 SMALL 中。直接调用时,效果很好。
>> foo.Output("Outputting...")
SMALL - Outputting...
这是与我的理解相冲突的地方。我认为定义class SMALL:BIG 与定义class SMALL 并从BIG 复制粘贴所有方法完全相同。总之,我认为上面的 SMALL 类相当于这样:
class SMALL
public void Output(string text = "")
Console.WriteLine("SMALL - " + text);
public void CallingOutput()
Output("Outputting...");
显然这是不正确的,因为
>> foo.CallingOutput()
BIG - Outputting...
当间接调用时,它仍然使用来自BIG 的原始Output(string)。
让foo.CallingOutput() 输出的正确方法是什么
"SMALL - Outputting..."
假设我无权访问BIG 并且不允许进行任何更改。而且我不想隐藏CallingOutput(),因为这基本上是重写课程。
(是的,隐藏CallingOutput() 使其工作)
我在发布之前进行了一些搜索,并在C++ 中找到了类似的问题。但是,这个问题的答案是不可能的。
- 我不相信。如此强大的语言,却无法告诉编译器哪个方法是哪个。
- 这是一种不同的语言,因此该帖子是允许的,因为它不能被视为重复。
【问题讨论】:
-
在基类中声明方法
virtual,在子类中声明override,然后基类将大小写,new在设计上不能这样工作 -
是的,
override和new不可互换。它们有不同的效果。通过显示您对foo的使用可以使您的问题更清楚;foo的类型和对象创建。 -
@abatishchev 如前所述,我不能对 BIG 进行更改。
-
那就不要继承了。它不是为继承而设计的。相反,您可以使用组合。创建您的 SMALL 类以引用 BIG 对象并根据需要使用它。不适用于所有情况,但可能会带您去您需要去的地方?
-
那么这是设计使然:您尝试破解 BIG(通过覆盖非虚拟内容来更改其行为)并且框架不允许您这样做(新作品仅在相同类型),因为这不是 BIG 的设计和预期行为方式,抱歉。但是请参阅@itsme86 的答案 - 这是正确的方法(但并不总是适用)
标签: c# class methods public protected