Получите статический класс в C # - PullRequest
1 голос
/ 12 марта 2011

Я знаю, что теоретически вы не можете (и не должны) получать статические классы в C #, но у меня есть случай, в котором, как мне кажется, он мне нужен ... Я хотел определить ряд статических констант для класса Aи, как я быстро обнаружил, вы не можете этого сделать, поэтому я последовал этому уроку: http://msdn.microsoft.com/en-us/library/bb397677.aspx

Итак, у меня есть такой статический класс:

public static class ClassAConstants
{
    public const string ConstantA = "constant_a";
    public const string ConstantB = "constant_b";
}

Затем яиметь класс B, который расширяет класс A и добавляет некоторые новые статические константы.Я хотел бы сделать следующее:

public static class ClassBConstants : ClassAConstants
{
    public const string ConstantC = "constant_c";
    public const string ConstantD = "constant_d";
}

Таким образом, четыре константы будут доступны с ClassBConstants.ConstantA или ClassBConstants.ConstantD.Тем не менее, C # не позволит мне сделать это.

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


РЕДАКТИРОВАТЬ:

БлагодаряЯ обнаружил, что константы неявно являются статическими, поэтому мне действительно не нужно было создавать эти искусственные статические классы (ClassAConstants и ClassBConstants).Решение не может быть проще:

public class A
{
    public const string ConstantA = "constant_a";
    public const string ConstantB = "constant_b";

    // ...

}
public class B : A
{
    public const string ConstantC = "constant_c";
    public const string ConstantD= "constant_d";

    // ...

}

С этим кодом я получаю результаты, которые я хотел изначально.

Ответы [ 4 ]

2 голосов
/ 12 марта 2011

Вы можете сделать так:

public static class ClassAConstants
{
    public const string ConstantA = "constant_a";
    public const string ConstantB = "constant_b";
}

public static class ClassBConstants
{
    public static string ConstantA
    {
        get { return ClassAConstants.ConstantA; }
    }
    public static string ConstantB
    {
        get { return ClassAConstants.ConstantB; }
    }
    public const string ConstantC = "constant_c";
    public const string ConstantD = "constant_d";
}

Но я не думаю, что вам действительно нужно это делать.

2 голосов
/ 12 марта 2011

Выберите Singleton вместо static класса.Тогда ваш класс получит преимущества от функций, доступных не для static класса, и пользователю просто нужно будет внести следующие изменения:

ClassAConstants.ConstantA ... в ... ClassAConstants.Instance.ConstantA

Кстати, если вас интересуют только const s, то приведенный ниже код также скомпилируется.И затем вы можете получить доступ к этим константам из экземпляров этих классов или напрямую, используя имя класса (например, доступ к статическому члену).

public class ClassAConstants
{
    public const string ConstantA = "constant_a";
    public const string ConstantB = "constant_b";
}

public class ClassBConstants : ClassAConstants
{
    public const string ConstantC = "constant_c";
    public const string ConstantD = "constant_d";
}

Это возможно, поскольку const s неявно static.

ClassAConstants.ConstantA .. работает.

ClassBConstants.ConstantA .. работает.

2 голосов
/ 12 марта 2011

Вы не можете наследовать от статических классов.

Если оба класса находятся под вашим контролем, вы всегда можете объединить их (при условии, что это не нарушит код других людей).

Если они не являются, тогда почему вы хотите создать впечатление, что класс B содержит функциональность, которой на самом деле нет?

Наконец, если вы действительно хотите пойти по этому пути, один из вариантов - скопировать / вставить статическийчлены из класса A в класс B.Но лично я думаю, что это будет плохой звонок.

0 голосов
/ 12 марта 2011

Вы всегда можете объявить свои классы как обычные классы (нестатические) и сохранить статические открытые члены.

...