C # Можно ли использовать экземпляр базового класса для разных экземпляров подклассов? - PullRequest
1 голос
/ 07 апреля 2011

Вот пример кода, объясняющего, что я хочу сделать:

Прежде всего, у меня есть базовый класс:

    public class BaseClass {
      int k = 100;
    }

Вот два подкласса:

public class SubClassA : BaseClass {}
public class SubClassB : BaseClass {}

когда я создаю экземпляр SubClassA и изменяю значение k, я хочу получить доступ к измененному значению в экземпляре SubClassB.вот что я имею в виду:

public class TestClass {
 public void doSomething() {
  SubClassA a = new SubClassA();
  SubClassB b = new SubClassB();

  a.k = 500;

  int j = b.k;
 }
}

обычно j имеет значение 100, но я хочу, чтобы оно имело измененное значение 500. Как я могу это реализовать или есть какой-то шаблон проектирования?

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

Ответы [ 4 ]

4 голосов
/ 07 апреля 2011

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

public class BaseClass
{
    public static int k = 100;
}
3 голосов
/ 07 апреля 2011

Это можно сделать, сделав поле / свойство базового класса статическим:

public class BaseClass {
   protected static int k = 100;
}

Это приведет к тому, что поле будет связано с типом BaseClass, а не с конкретным экземпляром - как таковой, он будет«разделяется» среди всех экземпляров подкласса.

1 голос
/ 07 апреля 2011

У вас есть два различных объекта, на которые ссылаются переменные a и b.Тот факт, что они оба являются подклассами одного и того же базового класса, не имеет значения.Чтобы изменение одного сказалось на другом, они либо должны знать друг о друге, либо оба знать о каком-то другом общем объекте.Например, вы могли бы иметь:

public class Int32Holder
{
    public int Value { get; set; }
}

class Foo
{
    private readonly Int32Holder valueHolder;

    public int Value
    {
        get { return valueHolder.Value; }
        set { valueHolder.Value = value; }
    }

    public Foo(Int32Holder valueHolder)
    {
        this.valueHolder = valueHolder;
    }
}

Тогда:

Int32Holder holder = new Int32Holder();
Foo a = new Foo(holder);
Foo b = new Foo(holder);
a.Value = 10;
Console.WriteLine(b.Value); // Prints 10

Однако я бы не посоветовал это ... этоделает для довольно запутанного поведения.

Почти наверняка есть лучшие шаблоны проектирования для того, что вы пытаетесь достичь - но мы не сможем помочь вам с ними, если вы не сообщите нам более широкую картину.

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

0 голосов
/ 07 апреля 2011

номер

Можете ли вы объяснить сценарий реального мира?

В вашем примере a и b являются экземплярами различий. У каждого из них есть независимое k, и каждый может изменить его, но только потому, что они подклассы одних и тех же вещей, они не «связаны» друг с другом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...