簡體   English   中英

如何強制派生 class 來實現 static 屬性或字段?

[英]How to force derived class to implement a static property or field?

這是我的摘要 class:

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

    float health;

    void someMethod()
    {
        health = HEALTH;
    }
}

這是我派生的 class:

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

編譯器先生說我不能讓成員 HEALTH static 以及 Enemy class 中的摘要。

我的目標是強制每個孩子 class 都有一個 static 或可以從父 class 訪問的常量字段。

有解決辦法嗎? 如果不是,最優雅的解決方法是什么? 使屬性非靜態?

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

通過在interface中使用static abstract成員,現在可以從 C#10 開始與問題的原始實現非常相似的東西:

public interface IEnemy
{
    public static abstract float Health { get; }

    public float GetHealth()
    {
        return (float)GetType().GetProperty(nameof(Health)).GetValue(null);
    }
}

public class BadGuy : IEnemy
{
    public static float Health => 1f;
}

超出此范圍的實施會因使用而有所不同,但是,如果希望以與原始問題類似的形式維護通用Enemy class,則可以采用以下一種方法*:

public class Enemy
{
    private float health;

    public void SetEnemy(IEnemy enemy)
    {
        health = enemy.GetHealth();
    }
}

*幾乎肯定存在更好的選擇,但同樣,它們會根據預期用途而有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM