为什么编译器会自动转换而不进一步继承?

时间:2013-10-01 09:25:21

标签: c# .net wpf oop inheritance

当我尝试运行以下代码片段时,它正在执行错误的重载方法。我很困惑为什么这样做? [testB.TestMethod(testValue)方法执行public double TestMethod(double value)方法]

public class TestA
{
    public int TestMethod(int value)
    {
        return value;
    }
}

public class TestB : TestA
{
    public double TestMethod(double value)
    {
        return value;
    }
}

static void Main( string[] args )
{
    TestB testB = new TestB();

    int testValue = 3;

    testB.TestMethod(testValue);
}

你对此有什么想法吗?

有没有办法通过TestB实例调用TestA类方法而不强制转换为TestA。?

但是在JAVA和C ++中没有发生

2 个答案:

答案 0 :(得分:22)

根据规范,在“过载决议”下:

  

...如果派生类中的任何方法适用(第7.6.5.1节),则基类中的方法不是候选者。

答案 1 :(得分:9)

  

<强>继承

     

继承可能会导致混乱的效果。当编译器去的时候   寻找实例方法重载,它考虑编译时   调用的“目标”的类,并查看声明的方法   那里。如果它找不到合适的东西,那么它会查看父级   上课......然后是祖父母班等。这意味着如果有的话   在层次结构的不同层次上的两种方法,“更深层次”   将被选中,即使它不是“更好的功能成员”   电话。

来源:http://csharpindepth.com/Articles/General/Overloading.aspx