2010-09-30 6 views
2

Может ли кто-нибудь объяснить, почему статическое свойство равно null?Statics Properties в абстрактных классах

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; 
    } 
} 

ответ

6

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

+1

На боковой ноте, поэтому ReSharper будет кричать на вас, если вы пытаетесь сделать что-то подобное (см статическое поле через Выводя класс). – 2010-09-30 09:58:14

+0

Я прочитал этот вопрос: http://stackoverflow.com/questions/774181/why-cant-i-inherit-static-classes, вы знаете, как я мог это сделать? статические свойства не поддерживаются в интерфейсах – fravelgue

+1

@fravelgue, как вы могли что-то сделать? Вы не объяснили, что вы пытаетесь сделать точно ... –

0

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

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

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

+0

Не хочу создавать объект. – fravelgue

+0

@fravelgue: Да, извините, я понимаю, что вы пытаетесь сделать - я просто пытался проиллюстрировать вызов, который необходим, чтобы получить то, что вы хотите, чтобы работать. Как и я, и другие говорили, статический конструктор на «Cc» не срабатывает, если вы просто получаете доступ к статическому свойству P1, которое находится на «Ca». Это не ошибка, как работает среда .NET. Если вам действительно нужно это сделать, тогда вам нужно будет найти другой способ сделать это. Я боюсь –

+0

thx очень для вас ответ, но похоже, что статическое наследование невозможно в C#, и не существует решение для этого. – fravelgue

0

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

new Cc(); // call the static constructor 
string s = Cc.P1; // not null now 
0

Вы злоупотребить некоторые принципы 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 
} 
Смежные вопросы