更新继承的方法C#

时间:2016-10-04 14:24:16

标签: c# inheritance

这里很新人,开始更深入地了解C#。

我想知道你是否可以“更新”一个继承的方法。在我的例子中,“Mage”类继承自“Hero”。两者都有一个“Shout”方法,但Mage的喊叫应该在屏幕上添加一行文字,但我只得到Hero的一个。

我不想覆盖Hero的Shout,但是“更新它”,所以Hero的孩子们可以喊出别的东西。我期待新的让我在使用它的同时修改旧方法,但没有运气。我错过了什么?

public class Hero
{
    protected string _name;

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    public Hero(string n)
    {
        Name = n;
    }

    public virtual void Shout()
    {
        Console.WriteLine("I am {0} and I am a hero! ", Name);
    }
}

public class Mage : Hero
{
    public Mage(string n) : base(n)
    {
        Name = n;
    }

    public new void Shout()
    {
        base.Shout();
        // Next line does not print...
        Console.WriteLine("Also, I am a fierce Mage!");
    }
}

坦克提供任何帮助,小费,......!

主要可能是:

 class Program
{
    static void Main(string[] args)
    {
        var h = new Hero("Paul One-Eye");
        // Old line, not working
        // var m = new Hero("Zangdar the Just");
        var m = new Mage("Zangdar the Just");

        h.Shout();
        m.Shout();
    }
}

预期输出应为:

  

我是Paul One-Eye,我是英雄!

     

我是Zangdar the Just,我是英雄!

     

另外,我是一个凶悍的法师!

编辑: 覆盖这样的方法会改变SOMETHING:

    public override void Shout()
    {
        base.Shout();
        Console.WriteLine("I am a fierce Mage!");
    }

3 个答案:

答案 0 :(得分:5)

您的代码工作正常但您使用Base Hero类初始化了Mage

你做了

var h = new Hero("Paul One-Eye");
var m = new Hero("Zangdar the Just");

应该是

var h = new Hero("Paul One-Eye");
var m = new Mage("Zangdar the Just");

答案 1 :(得分:1)

只是想知道为什么不能覆盖基类方法并扩展它?

public class Mage : Hero
{
    public Mage(string n) : base(n)
    {
        Name = n;
    }

    public override void Shout()
    {
        base.Shout();
        Console.WriteLine("Also, I am a fierce Mage!");
    }
}

"新"修饰符用于隐藏基类方法,而#34;覆盖"修饰符用于扩展基类方法(这正是你想要的),更多信息here

答案 2 :(得分:0)

考虑这个例子

你的主要是:

 class Program {

    static void Main(string[] args) {
        var h = new Hero("Paul One-Eye");
        var m = new Mage("Zangdar the Just");
        Hero m2 = (Hero)new Mage("Copyright the Infringed");

        h.Shout();
        m.Shout(); 
        m2.Shout();
    }
}


public class Mage : Hero {
    public new void Shout() {
        base.Shout();  Console.WriteLine("Also, I am a fierce Mage!");
    }
}

打印:

  

我是Paul One-Eye,我是英雄!

     

我是Zangdar Just,我是英雄!另外,我是一个凶悍的法师!

     

我是侵权版权,我是英雄!

但是如果你这样做:

public class Mage : Hero {
    public override void Shout() {
        base.Shout();  Console.WriteLine("Also, I am a fierce Mage!");
    }
}

打印:

  

我是Paul One-Eye,我是英雄!

     

我是Zangdar Just,我是英雄!另外,我是一个凶悍的法师!

     

我是侵权版权,我是英雄!另外,我是一个凶悍的法师!

接受你的选择。如果你想让英雄大喊大叫总是英雄大喊,即使英雄可能是一个法师,也可以使用新的。如果你希望英雄大喊一直反映英雄使用的子类型override