Свойства статики в абстрактных классах - PullRequest
2 голосов
/ 30 сентября 2010

Может кто-нибудь объяснить, почему статическое свойство имеет значение null?

class Program
{
    static void Main(string[] args)
    {
        string s = Cc.P1; // is null
    }
}

public class Cc
    : Ca
{
    static Cc()
    {
        P1 = "Test";
    }
}

public abstract class Ca
{
    public static string P1
    {
        get;
        protected set;
    }
}

Ответы [ 4 ]

6 голосов
/ 30 сентября 2010

Это потому, что когда вы пишете Cc.P1, вы на самом деле ссылаетесь на Ca.P1, потому что именно там он объявлен (поскольку P1 является статическим, он не участвует в полиморфизме). Таким образом, несмотря на внешний вид, ваш код вообще не использует класс Cc, а статический конструктор Cc не выполняется.

0 голосов
/ 30 сентября 2010

Вы неправильно используете некоторые принципы OOD в своем коде. Например, вы смешиваете в своих классах статическое поведение (что-то вроде шаблона проектирования Singleton) и полиморфизм (вы используете абстрактный базовый класс, но без интерфейса базового класса). И поскольку у нас нет такого понятия, как «статический полиморфизм», мы должны разделить эти две роли.

Если вы опишите более подробно, какую проблему вы пытаетесь решить, возможно, вы получите более точные ответы.

Но в любом случае вы можете реализовать что-то вроде этого:

public class Cc : Ca
{
    private Cc()
        : base("Test")
    {
       //We may call protected setter here
    }

    private static Ca instance = new Cc();
    public static Ca Instance
    {
        get { return instance; }
    }
}

public abstract class Ca
{
    protected Ca(string p1)
    {
        P1 = p1;
    }

    //You may use protected setter and call this setter in descendant constructor
    public string P1
    {
        get;
        private set;
    }
}


static void Main(string[] args)
{
    string s = Cc.Instance.P1; // is not null
}
0 голосов
/ 30 сентября 2010

Если вы действительно хотите значение:

new Cc();  // call the static constructor
string s = Cc.P1; // not null now
0 голосов
/ 30 сентября 2010

Попробуйте следующее:

string s = Cc.P1; // is null
Cc c = new Cc();
s = Cc.P1; // is it still null

Если P1 больше не равен нулю, это потому, что доступ к статическому P1 (в Ca) не вызывает срабатывание статического экземпляра Cc (и, следовательно, присваивает значениев статическом конструкторе).

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