[英]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.