这是一个奇怪的问题,我知道你不能覆盖C#中的变量。也许这行不通。我试图获取一个类型为类的变量,并用该类的子对象覆盖它。
为了把它放在上下文中,我有一个Character
类。它有一个类型为AttackSystem
的变量attackSystem
。我有一个从Character
继承的NPC
类,并且我正试图将attackSystem
重写为从AttackSystem
继承的类型NPCAttackSystem
。
这可行吗?或者,我是不是太复杂了?我不应该";覆盖";变量,而只是在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.(就可以了。
谢谢你的帮助,我喜欢在这里提问。
考虑如下方法。这种方法的主要好处是编译器知道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());
}
}
您可以这样做:
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())
{
}
}