这是一个奇怪的问题,我知道您无法在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.)都可以。
感谢您的帮助,我喜欢在这里提问。
答案 0 :(得分:2)
您可以执行以下操作:
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())
{
}
}
答案 1 :(得分:2)
请考虑以下方法。这种方法的主要好处是,编译器知道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());
}
}