为什么我无法访问 S 类方法?为什么我能够在类 M 中创建具有相同名称的方法?
public class S
{
public S()
{
}
public int myFunc(int a, int b)
{
return a + b;
}
}
public class M:S
{
public M()
{
}
public string myFunc(int a, int b)
{
return (a + b).ToString();
}
}
public class Test
{
public static void Main(string[] args)
{
M mm = new M();
mm.myFunc(1,2); // Why I am not able to access S class myFunc
}
}
最佳答案
这被称为 member hiding .您可以通过转换引用来访问 S
类方法:
public class Test
{
public static void Main(string[] args)
{
M mm = new M();
string x = mm.myFunc(1,2); // calls M.myFunc
int y = ((S)mm).myFunc(1,2); // calls S.myFunc
S ss = new M();
int z = ss.myFunc(1,2); // calls S.myFunc
}
}
你应该使用 new
modifier定义派生类成员时;否则,您将收到编译器警告。
编辑:注意成员隐藏不同于多态。在成员隐藏中,类成员在编译时根据引用的声明 类型解析。在我上面的示例中,ss
被声明为 S
,尽管它实际上被分配了一个 M
类型的实例。
要实现多态性,您需要在基类成员上指定virtual
修饰符,并在派生类成员上指定override
。因此,对虚拟成员的调用在运行时解析为实例的实际 类型。但是,多态性不允许您更改返回类型,因此您不能在您的示例中使用它。
关于c# - 没有得到这个继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22042206/