我有以下代码:
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
答案 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