繁体   English   中英

从父级调用子类方法

[英]Calling child class method from parent

是否有可能a.doStuff()方法在不编辑A类的情况下打印“B did stuff”? 如果是这样,我该怎么做?

class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        B b = new B();

        a.doStuff();
        b.doStuff();

        Console.ReadLine();
    }
}

class A
{
    public void doStuff()
    {
        Console.WriteLine("A did stuff");
    }
}

class B : A
{
    public void doStuff()
    {
        Console.WriteLine("B did stuff");
    }
}

我正在修改一个蒸汽游戏,Terraria。 而且我不想反编译并重新编译它们,因为那会搞砸蒸汽。 我的程序通过XNA“注入”Terraria。 我可以使用XNA中的update()和draw()方法修改一些东西。 但它非常有限。 我不想覆盖基本方法来修改更多东西(例如worldgen)。

是的,如果在A中将doStuff声明为virtual ,然后在B override

class A
{
    public virtual void doStuff()
    {
        Console.WriteLine("A did stuff");
    }
}

class B : A
{
    public override void doStuff()
    {
        Console.WriteLine("B did stuff");
    }
}

由于B实际上是A通过继承而且方法是重载的。

A a = new B();
a.doStuff();

您发布的A类和B类代码无论如何都会生成以下编译器警告,并会要求在B类上使用new关键字,尽管它会编译: 'B.doStuff()'上需要关键字new,因为它隐藏了继承成员'A.doStuff()'

使用method hiding类Mapper和B类中的newvirtual关键字,如下所示:

class Program
{
    static void Main(string[] args)
    {
        Mapper a = new B(); //notice this line
        B b = new B();

        a.doStuff();
        b.doStuff();

        Console.ReadLine();
    }
}

class A
{
    public void doStuff()
    {
        Console.WriteLine("A did stuff");
    }
}

class Mapper : A
{
    new public virtual void doStuff() //notice the new and virtual keywords here which will all to hide or override the base class implementation
    {
        Console.WriteLine("Mapper did stuff");
    }
}

class B : Mapper
{
    public override void doStuff()
    {
        Console.WriteLine("B did stuff");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM