【发布时间】:2018-06-15 13:06:34
【问题描述】:
我试图理解为什么它的行为如下
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 创建实例时,它应该调用基类方法,因为它继承了基类并具有新的关键字。
如果有人给出解释,将不胜感激
【问题讨论】:
-
在第二种情况下(ReadLine 之前)你不是说
obj2.Display()吗? -
Display的基本定义是否应该是Virtual,然后子实现可以覆盖基本定义而不是隐藏它?
-
@vc74 是的。我做错了:)。现在我明白了