c# - 没有得到这个继承

标签 c# oop inheritance

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

相关文章:

c# - 为什么 SelectedItem 不显示在组合框中

c# - 从 Google 图书下载文件

c# - 在我自己的程序中使用 Microsoft .NET 源代码

delphi - 使用字符串形式的类名确定 Delphi 6 类对象是否是派生类?

c# - 使用 LINQ 返回不同的 IQueryable?

python - 如何使用单个 init 调用来初始化链表节点?

swift - 如果不需要多个实例,使用类型方法而不是实例方法是否更好

c++ - OOP:没有静态成员或完全重新设计的类

c++ - C++单继承的内存布局和这个C代码一样吗?

C++ 封装技术