更新继承的方法C#
新来的帅哥,开始更深入地了解C 我想知道您是否可以“更新”继承的方法。在我的示例中,“法师”类继承自“英雄”。两者都有“呼喊”的方法,但是法师的呼喊应该会在屏幕上添加一行文字,但我只得到英雄的一行更新继承的方法C#,c#,inheritance,C#,Inheritance,新来的帅哥,开始更深入地了解C 我想知道您是否可以“更新”继承的方法。在我的示例中,“法师”类继承自“英雄”。两者都有“呼喊”的方法,但是法师的呼喊应该会在屏幕上添加一行文字,但我只得到英雄的一行 我不想压制英雄的呼喊,但“更新它”,让英雄的孩子们可以呼喊其他东西。我希望新的方法能让我在仍然使用它的同时修改旧的方法,但是运气不好。我错过了什么 public class Hero { protected string _name; public string Name {
我不想压制英雄的呼喊,但“更新它”,让英雄的孩子们可以呼喊其他东西。我希望新的方法能让我在仍然使用它的同时修改旧的方法,但是运气不好。我错过了什么
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
的方法呢。。。我有点为这件事感到羞耻。说得好!!不使用继承的类型本质上意味着这一点。解释如下:)