如何解决C#:如何覆盖/替换变量继承
这是一个奇怪的问题,我知道您无法在C#中覆盖变量。也许这行不通。我正在尝试使用类型为类的变量,并用该类的孩子覆盖它。
将其放在上下文中,我有一个Character
类。它具有类型为attackSystem
的变量AttackSystem
。我有一个NPC
类,它是从Character
继承的,并且我试图将attackSystem
的类型重写为NPCAttackSystem
,它是从AttackSystem
继承的。
这可行吗?还是我使事情变得过于复杂?我不应该“覆盖”变量,而应该在NPC
的构造函数中说attackSystem = new NPCAttackSystem()
(A)我在做什么(不起作用):
public class Character
{
public AttackSystem attackSystem = new AttackSystem();
}
public class NPC : Character
{
public NPCAttackSystem attackSystem = new NPCAttackSystem();;
}
public class AttackSystem {}
public class NPCAttackSystem: AttackSystem {}
(B)我应该怎么做?
public class Character
{
public AttackSystem attackSystem = new AttackSystem();;
}
public class NPC : Character
{
NPC()
{
attackSystem = new NPCAttackSystem();
}
}
public class AttackSystem {}
public class NPCAttackSystem: AttackSystem {}
我经常回答自己的问题。只是想知道我是否可以按照我想要的方式(A)进行操作,或者是否应该以其他方式(B)进行操作。 (B)的另一种方式行得通吗?我可以通过这种方式访问NPCAttackSystem
的成员吗?
很抱歉,所有问题,简单的A.)或B.)都可以。
感谢您的帮助,我喜欢在这里提问。
解决方法
您可以执行以下操作:
public class Character
{
public Character() : this(new AttackSystem())
{
}
protected Character(AttackSystem attackSystem)
{
AttackSystem = attackSystem;
}
public AttackSystem AttackSystem { get; }
}
public class NpcCharacter : Character
{
public NpcCharacter() : base(new NpcAttackSystem())
{
}
}
,
请考虑以下方法。这种方法的主要好处是,编译器知道npc.AttackSystem
的类型为NPCAttackSystem
(或至少可以安全地转换为NPCAttackSystem的类型)。
using System;
public class Program
{
public abstract class Character<T> where T: AttackSystem,new()
{
public T AttackSystem { get; } = new T();
}
public class PC: Character<AttackSystem>
{
}
public class NPC : Character<NPCAttackSystem>
{
}
public class AttackSystem {}
public class NPCAttackSystem: AttackSystem {}
public static void Main()
{
var normal = new PC();
var npc = new NPC();
Console.WriteLine(normal.AttackSystem.GetType());
Console.WriteLine(npc.AttackSystem.GetType());
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。