没有得到这个继承

没有得到这个继承

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

10-14 07:26