为什么在继承中调用固定数据类型参数的亚麻籽call Object类参数方法



案例1:

public class BaseClass
{
    public virtual void Print(int i)
    {
        Console.WriteLine("BaseClass Print(int)");
    }
}
public class DerivedClass : BaseClass
{
    public override void Print(int i)
    {
        Console.WriteLine("DerivedClass Print(int)");
    }
    public void Print(object obj)
    {
        Console.WriteLine("DerivedClass Print(object)");
    }
}
static void Main(string[] args)
{
    DerivedClass objDerivedClass = new DerivedClass();
    int i = 10;
    objDerivedClass.Print(i);
}

输出是DerivedClass Print(object)

案例2:

public class SomeClass
{
    public void Print(int i)
    {
        Console.WriteLine("DerivedClass Print(int)");
    }
    public void Print(object obj)
    {
        Console.WriteLine("DerivedClass Print(object)");
    }
}
static void Main(string[] args)
{
    SomeClass objSomeClass = new SomeClass();
    int i = 10;
    objSomeClass.Print(i);
}

输出是DerivedClass Print(int)

调用objDerivedClass.Print(i);方法后,输出为DerivedClass Print(object)。我不明白为什么将Print(object obj)的方法称为CC_5。

如果DerivedClass不继承BaseClass类,则输出为DerivedClass Print(int)

请解释.......

这是过载分辨率与继承一起工作的方式:

  1. 包括override修饰符的功能不包括在候选人集中。
  2. 由于可以使用具有object参数的函数,因此从候选人组中删除了基数中声明的函数。

获胜者是带有object参数的功能。

根据Eric Lippert(来自Microsoft(的说法:

这是通过设计,有充分的理由。这种设计有助于防止脆性基类问题。C#旨在使编写"版本化"组件变得更容易,更安全,而该规则是其中的很大一部分。

当不使用继承时,两个功能都是候选者,并且使用了更具体的功能。获胜者是int参数的功能。

相关内容

  • 没有找到相关文章

最新更新