В C # нет сочетания переопределяемости и статичности; это в некотором смысле противоположности.
Лучшая техника - создавать экземпляры; эти случаи могут быть одиночными, если это имеет смысл. Я был бы склонен сделать что-то вроде:
abstract class Powerup
{
public virtual int Cooldown => 1
}
sealed class Freeze : Powerup
{
}
sealed class Burn : Powerup
{
public override int Cooldown => 2;
}
Но техника, которая мне особенно нравится, когда это синглтоны:
abstract class Powerup
{
private Powerup() {} // Prevent instantiation
public virtual int Cooldown => 1
public static readonly Powerup Freeze = new FreezePower();
private sealed class FreezePower : Powerup
{
}
public static readonly Powerup Burn = new BurnPower();
private sealed class BurnPower : Powerup
{
public override int Cooldown => 2;
}
}
Теперь посмотрите на использование сайта:
Console.WriteLine(Powerup.Freeze.Cooldown); // 2
Мне кажется, это очень хорошо выглядит на сайте использования.