这是两个类:
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完全无关紧要,因为编译时类型objB是ClassB.