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());
    }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...