C#:在基础 class 中定义方法实现,在派生 classes 中定义属性

C#: Define methods implementation in base class and properties in derived classes

我正在制作一款游戏,其中有多种士兵,每种都有自己的属性(速度、攻击力...)。显然,他们所有人都可以行走、攻击……所以我认为用这些方法创建一个抽象的 class 士兵,以及每个单位属性的子classes 是合适的。问题是我不能在基础中使用派生 classes 的属性。

最简单的方法可能是在派生的 classes 中实现方法,但这意味着大量重复代码,我想避免它。事实上,这会使基数 class 变得不必要。

我已经尝试了几种方法。据我所知,我尝试过的最接近的解决方案是使用 abstract/virtual 属性,但我会再次为每个单元类型复制 "get" 代码。也许这无法避免,但如果可能的话,我愿意。

肯定存在一个我没有想到的简单解决方案。 ¿有什么想法吗?

我有这样的想法:

public abstract class Soldier {

    public int AttackPower {
        get { return this.power; }
    }

    public Attack {
        Console.WriteLine("Attacked with "+AttackPower+" attack power");
    }
}

public class Lancer:Soldier {

    int power=5;
}

public class Archer:Soldier {

    int power=10;
}

当然,这不是一个正确的解决方案,因为 Soldier class 不知道 "power" 变量,但是如果我在 Soldier 中声明 "power" 变量class,因为字段名称重复,我得到一个错误。

任何帮助将不胜感激。

你需要一个摘要属性:

public int AttackPower {
        get { return this.power; }
    }

protected abstract int Power { get; }

public class Lancer:Soldier {

    protected override int Power { get { return 5; } }
}

如果您真的不喜欢属性,您也可以使用 "GetPower" 方法。正如您所发现的,如果基础 class 方法需要访问数据,您 必须 在基础 class.[=11= 中声明该数据]

不是代码重复,是类型安全!

为什么不直接在基数 class 中放一个 Power 属性

public abstract class Soldier {
    public int Power {get; set;}

    public int AttackPower {
        get { return this.Power; }
    }

    public Attack {
        Console.WriteLine("Attacked with "+AttackPower+" attack power");
    }
}

public class Lancer:Soldier {
    public Lancer()
    {
        Power = 5
    }
}

public class Archer:Soldier {
    public Archer()
    {
         Power=10;
    }
}

一些设计意见:

  • ArcherLancer 是否需要不同的 classes,或者它们只是 Soldier配置不同?
  • 最好从数据源中提取 属性 值,而不是在源代码中对它们进行硬编码。您可以嵌入一个 XML 文件或其他文件,这样它就不容易编辑了。