如果覆盖了方法,则覆盖方法调用的不同行为

时间:2018-12-20 08:01:23

标签: c# .net class oop inheritance

我有两个重载的方法MyMethod。一个带有int作为参数,另一个带有long

从外部使用整数调用此方法将调用MyMethod(int)成员。但是,如果覆盖了int的方法,则会调用MyMethod(long)。我不明白为什么dot.net会这样。有人可以解释技术背景吗? 对我来说,这似乎是个错误。

示例 1。 3。(请参见下面的代码)的行为与我期望的一样。但是 2。我无法解释为什么代码会调用long方法。

// 1. Normal Overloading

class Program
{
    static void Main(string[] args)
    {
        int value = 123;
        new MyClass().MyMethod(value);

        // Output: Method INT

        Console.ReadKey();
    }
}

class MyClass
{
    public void MyMethod(int value)
    {
        Console.WriteLine("Method INT");
    }

    public void MyMethod(long value)
    {
        Console.WriteLine("Method LONG");
    }
}


// 2. Combine Overriding with Overloading

class Program
{
    static void Main(string[] args)
    {
        int value = 123;
        new MyChildClass1().MyMethod(value);

        // Output: Method LONG

        Console.ReadKey();
    }
}

class MyParentClass
{
    public virtual void MyMethod(int value)
    {
        Console.WriteLine("Method INT");
    }
}
class MyChildClass1 : MyParentClass
{
    public override void MyMethod(int value)
    {
        Console.WriteLine("Method INT");
    }

    public void MyMethod(long value)
    {
        Console.WriteLine("Method LONG");
    }
}


// 3. Inherit but use New for overloading

class Program
{
    static void Main(string[] args)
    {
        int value = 123;
        new MyChildClass2().MyMethod(value);

        // Output: Method INT

        Console.ReadKey();
    }
}

class MyParentClass
{
    public virtual void MyMethod(int value)
    {
        Console.WriteLine("Method INT");
    }
}
class MyChildClass2 : MyParentClass
{
    public new void MyMethod(int value)
    {
        Console.WriteLine("Method INT");
    }

    public void MyMethod(long value)
    {
        Console.WriteLine("Method LONG");
    }
}

1 个答案:

答案 0 :(得分:1)

这不是错误,是有计划的行为(但我同意,这尤其与其他示例相比有点令人困惑)。来自here

  

这种行为的一方面特别令人惊讶。什么算作在类中“声明”的方法?事实证明,如果您在子类中重写基类方法,则不算是声明该方法。