为什么我无法访问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/