如何让派生类重写基类字段的默认值?代码示例疑问
问题解答:让派生类"重写"基类字段的默认值
首先得明确一个核心点:C#里的字段是不支持重写(override)的,你当前代码里用new public string Name = "Hammer"只是在派生类中隐藏了基类的Name字段,这并不是真正的多态重写。所以当你用ItemBase类型的引用(MyThing)去访问Name时,编译器只会识别基类的字段,自然输出"Base"。
要实现你想要的效果(基类引用指向派生类实例时,返回派生类的名称),正确的做法是用属性+多态,具体步骤如下:
1. 将基类的字段改为虚拟属性
把基类里的Name字段改成带virtual修饰符的属性,给派生类留下重写的入口:
public class ItemBase { public virtual string Name { get; } = "Base"; }
2. 在派生类中重写该属性
在Hammer类里用override关键字重写Name属性,设置你需要的默认值:
public class Hammer : ItemBase { public override string Name { get; } = "Hammer"; }
3. 修正测试代码的小错误
你原测试代码里有个小问题:Console.WriteLine(ItemBase.Name)应该是Console.WriteLine(MyThing.Name)——ItemBase.Name是访问类的静态成员,而你需要的是实例的Name。修正后的测试类:
public class Test { public static void Main() { ItemBase MyThing = new Hammer(); // 现在会输出"Hammer" Console.WriteLine(MyThing.Name); } }
这样修改后,借助C#的多态特性,当你用ItemBase类型的引用指向Hammer实例时,会自动调用派生类Hammer中重写的Name属性,就能得到你想要的结果了。
内容的提问来源于stack exchange,提问作者Daarwin
相关产品推荐
相关产品推荐

