C#:如何覆盖/替换变量继承



这是一个奇怪的问题,我知道你不能覆盖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())
{
}
}

相关内容

  • 没有找到相关文章

最新更新