Пользовательские статические переменные для дочерних классов - PullRequest
0 голосов
/ 24 января 2019

У меня есть что-то вроде этого:

class powerup {
public static int cooldown = 1;
}

class freeze : powerup {

//some unrelated code
}
class burn : powerup {

//unrelated
}

, и я хотел бы иметь другое значение для перезарядки заморозки и прожигания бонусов, и в статическом режиме, так как я не могу их создатьгде я устанавливаю время восстановления, и также имеет смысл иметь их статичные, так как они уникальны.Так что я чувствую, что мне нужно отменить перезарядку "new", но это не правильно.Есть ли какое-то решение, о котором я не знаю?Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 24 января 2019

В 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

Мне кажется, это очень хорошо выглядит на сайте использования.

0 голосов
/ 24 января 2019

Вы можете использовать новый модификатор , чтобы скрыть родительское свойство в дочерних классах, например:

class powerup
{
    public static int cooldown = 1;
}

class freeze : powerup
{
    public new static int cooldown = 3;
    //some unrelated code
}
class burn : powerup
{
    public new static int cooldown = 2;
    //unrelated
}

Это обеспечивает следующие результаты:

Console.WriteLine($"powerup: {powerup.cooldown}");
Console.WriteLine($"freeze: {freeze.cooldown}");
Console.WriteLine($"burn: {burn.cooldown}");

enter image description here

0 голосов
/ 24 января 2019

Я полагаю, что вы хотите обновить значение времени восстановления всех экземпляров определенного бонуса.В этом случае я бы использовал что-то вроде этого:

interface IPowerup {
    int Cooldown { get; set; }
}

class Freeze : IPowerup {
    private static int _cooldown;
    public int Cooldown { get { return _cooldown } set { _cooldown = value; }
    public Freeze() { Cooldown = 1; }
}

class Burn : IPowerup {
    private static int _cooldown;
    public int Cooldown { get { return _cooldown } set { _cooldown = value; }
    public Burn() { Cooldown = 2; }
}

Так что теперь, если вы устанавливаете время восстановления для одного включения, вы устанавливаете значение для всех.

Вы также можете отменитьс конструкторами и создания экземпляров бонусов и установите период восстановления, как это:

var burnPowerup = new Burn { Cooldown = 2 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...