我试图理解为什么它表现如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstarctWithInterfcae
{
public interface IBase
{
void Display();
}
public abstract class Base : IBase
{
public void Display()
{
Console.WriteLine("Base Display");
}
}
public class child1 : Base, IBase
{
public new void Display()
{
Console.WriteLine("child1 Display");
}
}
public class child2 : Base,IBase
{
public new void Display()
{
Console.WriteLine("child2 Display");
}
}
class Program
{
static void Main(string[] args)
{
IBase obj = new child1();
obj.Display(); // writing child1 display
IBase obj2 = new child2();
obj.Display(); //Wrirting child1 dispaly
Console.ReadLine();
}
}
}
第一个问题:
在上面的程序中,因为我正在使用new,所以应该调用基类方法,为什么要调用Child 1 Display?
据我了解,我们已经实现了IBase的基类,因此,当我们通过引用接口为child1创建实例时,它应该调用基类方法,因为它继承了基类并具有新的关键字。
如果有人给出解释,将不胜感激
方案1是因为您使用obj.Display()
而不是obj2.Display()
场景2是因为您使用的是通用接口引用IBase
,所以(IBase obj = new child2()
)和C#将选择最不复杂的类型以适合实际的对象类型,因为它假定您要对类型的“最不特定版本”进行操作,因为不具体。
编辑:注意到不满意,我假设有人认为这个答案不够完整;
如果OP希望正确看到错误2的输出,则可以将类型实例化为 Child2 obj = new Child2();
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句