2010-09-30 9 views
2

Quelqu'un pourrait expliquer pourquoi la propriété statique est nulle?Propriétés dans les classes abstraites Statics

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

Répondre

6

parce que, quand vous écrivez Cc.P1, vous parlez en fait Ca.P1 parce que c'est où elle est déclarée (depuis P1 est statique, il ne participe pas au polymorphisme). Ainsi, malgré les apparences, votre code n'utilise pas du tout la classe Cc et le constructeur statique Cc n'est pas exécuté.

+1

D'un côté note, c'est pourquoi ReSharper criera à vous si vous essayez de faire quelque chose comme ça (se référer à un champ statique par une dérivation classe). –

+0

J'ai lu cette question: http://stackoverflow.com/questions/774181/why-cant-i-inherit-static-classes, savez-vous comment pourrais-je faire cela? propriétés statiques ne supportent pas dans les interfaces – fravelgue

+1

@fravelgue, comment pourriez-vous faire quoi? Vous n'avez pas expliqué ce que vous essayiez de faire exactement ... –

0

Effectuez les opérations suivantes:

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

Si P1 est plus, elle est nulle, car l'accès à la P1 statique (Ca) ne provoque pas l'instance statique de Cc au feu (et donc affecter la valeur le constructeur statique).

+0

Je ne veux pas créer un objet. – fravelgue

+0

@fravelgue: Oui, désolé, je comprends ce que vous essayez de faire - j'essayais juste d'illustrer l'appel qui est nécessaire pour que ce que vous voulez arriver à travailler. Comme l'ont dit moi-même et d'autres, le constructeur statique sur "Cc" ne se déclenchera pas si vous venez d'accéder à la propriété statique P1 qui est sur "Ca". Ce n'est pas un bug, c'est le fonctionnement du framework .NET. Si vous avez vraiment besoin de faire cela, alors vous aurez besoin de trouver une autre façon de le faire, je crains –

+0

thx beaucoup pour vous la réponse, mais il semble l'héritage statique est impossible dans C#, et il isnt solution pour cela. – fravelgue

0

Si vous voulez vraiment la valeur:

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

Vous abusez des principes OOD dans votre code. Par exemple, vous mélangez dans vos classes un comportement statique (quelque chose comme Singleton Design Pattern) et un polymorphisme (vous utilisez une classe de base abstraite mais sans interface de classe de base). Et parce que nous n'avons rien de tel que le "polymorphisme statique", nous devrions séparer ces deux rôles.

Si vous décrivez plus en détail ce sont les problèmes que vous essayez de résoudre, peut-être vous recevoir des réponses plus précises.

Mais de toute façon, vous pouvez mettre en œuvre quelque chose comme ceci:

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 
}