强制覆盖基类的方法

时间:2013-04-04 09:08:16

标签: c# inheritance interface partial-classes method-overriding

我有以下代码:

public partial class Root : ICustomInterface
{
    public virtual void Display()
    {
        Console.WriteLine("Root");
        Console.ReadLine();
    }
}
public class Child : Root
{
    public override void Display()
    {
        Console.WriteLine("Child");
        Console.ReadLine();
    }
}
class Program
{
    static void Main(string[] args)
    {
        Root temp;
        temp = new Root();
        temp.Display();
    }
}

Output: "Root"
Desired output: "Child"

当我实例化Root对象并调用Display()方法时,我希望在Child中显示重写方法,这是可能的。

我需要这个,因为我必须创建一个插件,该插件是基本代码的扩展,并且使Display()类的Root方法无效并仅实现插件的方法Child

5 个答案:

答案 0 :(得分:6)

  

当我实例化Root对象并调用我想要的Display()方法时   在Child中显示被覆盖的方法是可能的。

您需要创建Child类的实例。

Root temp;
temp = new Child(); //here
temp.Display();

目前你的对象temp持有对基类的引用,它对子进程没有任何了解,因此对基类的输出也不了解。

答案 1 :(得分:2)

  

当我实例化Root对象并调用Display()方法时,我想在Child中显示重写方法,这是可能的。

没有。假设您添加了另一个类:

public class Child2 : Root
{
    public override void Display()
    {
        Console.WriteLine("Child 2");
        Console.ReadLine();
    }
}

那么您希望为Child.Display()实例调用哪种方法(Child2.Display()Root)?

答案 2 :(得分:1)

目前的代码是不可能的,因为您正在创建Root实例而不是Child实例。因此,它不知道Display内的Child方法。

您需要创建一个Child类:

Root temp;
temp = new Child();
temp.Display();

答案 3 :(得分:1)

这不是OOP的工作原理。您不能在基类中使用重写方法。如果你这样做:

static void Main(string[] args)
{
    Root temp;
    temp = new Child();
    temp.Display();
}

你应该得到你想要的输出。

答案 4 :(得分:1)

不,你不可能实例化一个Child对象而不是root

Root temp;
temp = new Child();
temp.Display();

如果您不想修改temp,则必须修改Root显示方法以打印“child”而不是root