C# 为什么在继承中调用固定数据类型参数的对象类参数方法linseed
案例1: 输出为导出类打印(对象) 案例2:C# 为什么在继承中调用固定数据类型参数的对象类参数方法linseed,c#,inheritance,overload-resolution,C#,Inheritance,Overload Resolution,案例1: 输出为导出类打印(对象) 案例2: 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
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打印(int)
调用objDerivedClass.Print(i)后方法,输出为DerivedClass打印(对象)
。我不明白为什么调用方法Print(objectobj)
而不是Print(inti)
如果DerivedClass
未继承BaseClass
类,则输出为DerivedClass打印(int)
请解释……这是重载解析如何与继承一起工作的:
包含覆盖
修饰符的函数将从候选函数集中排除
由于可以使用带有对象
参数的函数,因此在基中声明的函数将从候选函数集中删除
赢家是带有对象
参数的函数
根据:
这是故意的,也是有充分理由的。这种设计有助于防止脆弱的基类问题。C#的设计目的是使编写“版本化”组件更容易、更安全,而这条规则是其中的一个重要部分
当不使用继承时,两个函数都是候选函数,并使用更具体的函数。优胜者是带有int
参数的函数。C语言规范的第7.5.3节是关于重载解析的,因此您应该参考它。考虑到这种行为,我假设,如果存在多个可能的候选对象,则当前类型的成员比基类型的重载成员更可取。这实际上不是一个问题,因为如果参数是适当的类型,您总是可以编写重载来调用重写。
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);
}