Matrimony Ответов: 3

Проблема статического свойства


public abstract class A
    {
        public static string f { get; set; }
    }

    public class B : A {
        static B()
        {
            f = "B";
        }
    }

    public class C : A
    {
        static C()
        {
            f = "C";
        }
    }


Что я уже пробовал:

C c = new C();
B b = new B();
The result is:
C.f is B
B.f is B
A.f is B

what i expect is:
C.f is C
B.f is B
A.f is NULL

How to implement this using static property?

3 Ответов

Рейтинг:
14

Matrimony

я нашел решение этой проблемы:
публичный абстрактный класс а
{
публичная статическая строка f { get; set; }
}


открытый класс Б : {
общественный новый статическая строка f { get; set; }
статические Б()
{
f = "B";
}
}

открытый класс Си :
{

общественный новый статическая строка f { get; set; }
статический C()
{
f = "C";
}
}


Рейтинг:
1

OriginalGriff

f является static: существует один из них для всего приложения. Потому что оба B и C производные от A, они имеют одну и ту же статическую переменную: последнее значение, которое вы зададите ей, будет глобальным значением, которое она имеет, независимо от того, задаете ли вы ее через экземпляр B или C

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


Рейтинг:
0

phil.o

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

Правка: пример реализации.

public abstract class A
{
   public string F { get; protected set; }
}

public class B : A
{
   public B()
   {
      F = "B Class";
   }
}

public class C : A
{
   public C()
   {
      F = "C Class";
   }
}

Надеюсь, это поможет.


Matrimony

Допустим, у меня есть класс продукта, который имеет поле ProductType. И два дочерних класса, мышь и клавиатура, тип продукта которых-мышь или клавиатура. Таким образом, ProductType можно использовать в области действия каждого дочернего класса.

phil.o

Но это не означает, что свойство ProductType должно быть статическим :)

Matrimony

моя цель-поделиться типом продукта в каждом дочернем классе.
В этом случае есть ли у вас другие предложения? спасибо.

phil.o

Просто оставьте свойство как нестатическое в базовом классе. В конструкторах дочерних классов просто назначьте нужное значение.
Вы можете сделать доступ к имуществу общедоступным для get и под защитой set; таким образом, он будет общедоступен для чтения в экземплярах классов, но доступен только для записи из реализаций дочерних классов.
Я обновил свое решение, чтобы дать вам быстрый пример.