抽象类中的静态属性

时间:2010-09-30 09:49:04

标签: c# static abstract-class

有人可以解释为什么静态属性为空吗?

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 个答案:

答案 0 :(得分:6)

那是因为当你写Cc.P1时,你实际上指的是Ca.P1,因为它是声明它的地方(因为P1是静态的,它不参与多态)。因此,尽管出现了,但您的代码根本没有使用Cc类,并且不会执行Cc静态构造函数。

答案 1 :(得分:0)

尝试以下方法:

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

如果P1不再为空,那是因为访问静态P1(在Ca中)不会导致Cc的静态实例触发(因此在静态构造函数中赋值)。

答案 2 :(得分:0)

如果你真的想要这个值:

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

答案 3 :(得分: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
}