Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新继承的方法C#_C#_Inheritance - Fatal编程技术网

更新继承的方法C#

更新继承的方法C#,c#,inheritance,C#,Inheritance,新来的帅哥,开始更深入地了解C 我想知道您是否可以“更新”继承的方法。在我的示例中,“法师”类继承自“英雄”。两者都有“呼喊”的方法,但是法师的呼喊应该会在屏幕上添加一行文字,但我只得到英雄的一行 我不想压制英雄的呼喊,但“更新它”,让英雄的孩子们可以呼喊其他东西。我希望新的方法能让我在仍然使用它的同时修改旧的方法,但是运气不好。我错过了什么 public class Hero { protected string _name; public string Name {

新来的帅哥,开始更深入地了解C

我想知道您是否可以“更新”继承的方法。在我的示例中,“法师”类继承自“英雄”。两者都有“呼喊”的方法,但是法师的呼喊应该会在屏幕上添加一行文字,但我只得到英雄的一行


我不想压制英雄的呼喊,但“更新它”,让英雄的孩子们可以呼喊其他东西。我希望新的方法能让我在仍然使用它的同时修改旧的方法,但是运气不好。我错过了什么

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();
    }
}
预期产出应为:

我是保罗一只眼,我是一个英雄

我是正义的赞达,我是英雄

还有,我是一个凶猛的法师

编辑: 像这样重写该方法会更改某些内容:

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

只是想知道为什么不重写基类方法并扩展它

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!");
    }
}

“new”修饰符用于隐藏基类方法,而“override”修饰符用于扩展基类方法(这正是您想要的),更多信息

您的代码工作正常,但您使用基本英雄类初始化了您的法师

你做到了

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");
以这个例子为例

你的主要观点是:

 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!");
    }
}
印刷品:

我是保罗一只眼,我是一个英雄

我是正义的赞达,我是英雄!还有,我是一个凶猛的法师

我是侵犯版权者,我是英雄

但是,如果您这样做:

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

我是保罗一只眼,我是一个英雄

我是正义的赞达,我是英雄!还有,我是一个凶猛的法师

我是侵犯版权者,我是英雄!还有,我是一个凶猛的法师


你挑吧。如果你希望英雄呼喊永远是英雄呼喊,即使英雄可能是法师,使用新的。如果您希望英雄呼喊始终反映英雄所属的子类型,请使用
override

“以便英雄的孩子可以呼喊其他内容”,这正是重写方法所要做的。为什么不想覆盖它?覆盖就是更新它。你不能既做又不做。你也不是第二次做法师。你应该仔细看看
new
override
-关键字对成员做了什么,例如:你不是在创建法师,
h
m
都属于
Hero
类型。如果你不告诉编译器任何实例是
Mage
,编译器怎么知道它应该推断出
Mage
的方法呢。。。我有点为这件事感到羞耻。说得好!!不使用继承的类型本质上意味着这一点。解释如下:)