1

これは私の抽象クラスです:

abstract class Enemy
{
    protected static abstract float HEALTH
    {
        get;
    }

    float health;

    void someMethod()
    {
        health = HEALTH;
    }
}

これは私の派生クラスです:

abstract class BadGuy : Enemy
{
    protected override static float HEALTH
    {
        get { return 1; }
    }
}

Compiler さんは、Enemy クラスのメンバ HEALTH を static にすることも、abstract にすることもできないと言っています。

私の目標は、各子クラスに、親クラスからアクセスできる静的フィールドまたは定数フィールドを強制することです。

これに対する解決策はありますか?そうでない場合、最もエレガントな回避策は何ですか? プロパティを非静的にしますか?

4

1 に答える 1

6

staticと継承は連携しません。できることは、派生クラスでオーバーライドできる仮想プロパティを作成することです。必要に応じて、基本実装を 内に提供するか、またはしたくない場合はEnemyそのままにしておくことができます。abstract

public abstract class Enemy
{
    protected abstract float Health { get; }
}

public class BadGuy : Enemy
{
    private const int BadGuyHealth = 1;
    protected override float Health
    {
        get { return BadGuyHealth; }
    }
}

public class EvenWorseGuy : BadGuy
{
    private const int WorseGuyHealth = 2;
    protected override float Health
    {
        get { return WorseGuyHealth; }
    }
}
于 2016-01-10T12:46:10.060 に答える