Могу ли я иметь базовый класс, где каждый производный класс имеет свою собственную копию статического свойства? - PullRequest
5 голосов
/ 21 февраля 2011

У меня есть что-то вроде следующей ситуации:

class Base
{
     public static int x;
     public int myMethod()
     {
          x += 5;
          return x;
     }

}

class DerivedA : Base
{
}

class DerivedB : Base
{
}

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

 DerivedA.x = 5;
 DerivedB.x = 10;

тогда, когда я бегу:

 DerivedA.myMethod(); //The result will be 10
 DerivedB.myMethod(); //The reusult will be 15

Могу ли я сделать что-то подобное? Как я могу настроить производные классы для достижения этой цели? Спасибо, ребята.

РЕДАКТИРОВАТЬ: По сути, у меня есть несколько производных классов, каждый из которых имеет свойство, уникальное для этого класса. Он не меняется для каждого экземпляра, и поэтому я считаю, что это должна быть статическая переменная. Кроме того, это свойство устанавливается методом, который одинаков для каждого из этих классов. Я пытаюсь избежать необходимости копировать и вставлять логику для этого свойства и метода в каждый из этих производных классов. Я подумал, что лучше как-то перенести эту логику в базовый класс, из которого происходит каждый из этих классов. Но мне нужно, чтобы у каждого производного класса была своя копия этого свойства. Мне не обязательно делать это таким образом, и я буду рад услышать несколько советов по улучшению практики, если у вас, ребята, есть какие-то .. Спасибо!

Ответы [ 4 ]

10 голосов
/ 21 февраля 2011

Ну, да, вы можете, но это вращается вокруг хитрости с дженериками.

Намного лучше, если вы исправите свой дизайн так, что вам не нужно это статическое поле, или, по крайней мере, не для каждого потомка, но здесь идет речь:

class Base<TDescendant>
    where TDescendant : Base
{
     public static int x;
     public int myMethod()
     {
          x += 5;
          return x;
     }

}

class DerivedA : Base<DerivedA>
{
}

class DerivedB : Base<DerivedB>
{
}

Это зависит от того факта, что универсальный тип со статическими полями будет получать отдельную копию этих статических полей для каждого типа, с которым вы его вызываете.

Однако, если вы намереваетесь спуститься с DerivedA или DerivedB, это будет сложно, поэтому я бы не рекомендовал идти по этой полосе.

5 голосов
/ 21 февраля 2011

Вам нужно будет переопределить и скрыть поле и метод во всех производных типах.

Пример:

class DerivedA : Base
{
  public new static int x;
  public new int myMethod()
  {
    x += 5;
    return x;
  }
}

Примечание: не делайте так.Исправьте свой дизайн.

Редактировать:

На самом деле, у меня есть похожая конструкция.Я решаю его с помощью абстрактного (если вам нужно значение по умолчанию, используйте virtual) свойства, которое затем используется базовым классом:

public abstract class Base
{
   public abstract string Name { get; }

   public void Refresh()
   {
     //do something with Name
   }
}

public class DerivedA
{
  public override string Name { get { return "Overview"; } }
}

Вы должны иметь возможность настроить его для своего варианта использования.Конечно, вы можете задать свойство protected, если только производные классы смогут его видеть.

1 голос
/ 14 мая 2016

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

public class Base
{
    private static Dictionatry<Type,int> _values;

    public int MyMethod()
    {
        _values[this.GetType()]+=5;
        return _values[this.GetType()];
    }
}
0 голосов
/ 21 февраля 2011

Я обычно реализую специфичные для подкласса вещи как абстрактное свойство get

public class Base
{
    // You must pick one option below

    // if you have a default value in the base class
    public virtual int x { get { return 7; /* magic default value */} }

    // if you don't have a default value
    // if you choose this alternative you must also make the Base class abstract
    public abstract int x { get; }
}

public class DerivedA : Base
{
    public override int x { get { return 5; } }
}

public class DerivedB : Base
{
    public override int x { get { return 10; } }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...