解释继承方法覆盖

iJa*_*ade -1 c# oop

这是两个类:

public class ClassA
{
    public string result()
    {
        return "ClassA_Result";
    }
}
Run Code Online (Sandbox Code Playgroud)

public class ClassB : ClassA
{
    public string result()
    {
        return "ClassB_Result";
    }
}
Run Code Online (Sandbox Code Playgroud)

当我创建一个ClassB实例时,我得到的结果是ClassB_Result.我期待结果ClassA_Result

 ClassB objB = new ClassB();

 string b = objB.result();    //result is `ClassB_Result`
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 16

首先,你没有超越result()方法 - 实际上你不能,因为它不是虚拟的.

编译器应该给你一个这样的警告:

警告CS0108:'ClassB.result()'隐藏继承的成员'ClassA.result()'.如果要隐藏,请使用new关键字.

始终始终阅读编译器警告.他们在那里帮助你.

您应该virtual在方法中ClassA使用override修饰符,并在方法中使用修饰符ClassB.我还鼓励你遵循.NET命名约定 - 我知道这只是一个示例,但即使在虚拟代码中也值得遵循约定.(result应该是Result.)

现在,即使你已经修复了这样的代码,你仍然会得到ClassB_Result- 因为你正在创建一个实例ClassB.如果你写下:

ClassA objB = new ClassB();
string b = objB.result();
Run Code Online (Sandbox Code Playgroud)

使用该片段,在您当前的代码中,它将给出结果,ClassA_Result因为该方法未被虚拟调用.使用固定代码,它会产生结果,ClassB_Result因为ClassB将调用覆盖.目前,您的方法ClassA完全无关紧要,因为编译时类型objBClassB.