Завершить вложенный частичный класс в дочернем классе

У меня есть два класса, A и B. B наследует от A.

Вот моя проблема: у меня есть константа ConstantA, которая полезна для класса A, но также и для дочерних классов. У меня также есть константа ConstantB, характерная для моего класса B.

Поскольку я храню свои константы в общедоступном статическом вложенном классе, класс Constants в дочернем классе скрывает родительский класс. Я попытался сделать это частичным классом, это не помогает. Есть ли способ решить это?

Вот пример:

public class A 
{
    public static partial class Constants
    {
        public const int ConstantA = 1;
    }
}

public class B : A 
{
    public static partial class Constants
    {
        public const int ConstantB = 1;
    }
}

Спасибо!

3 ответа

Решение

Вам нужно будет сделать A частичный класс, и объявите свою B-специфическую константу отдельно от B сам класс:

public partial class A
{
    public static partial class Constants
    {
        public const int ConstantA = 1;
    }
}

public partial class A
{
    public static partial class Constants
    {
        public const int ConstantB = 1;
    }
}

public class B : A
{
    static void M()
    {
        int i = Constants.ConstantB;
        int j = Constants.ConstantA;
    }
}

Тем не менее, я скептически отношусь к тому, что дизайн - это все хорошо. Это эффект объявления вашего ConstantB значение внутри Aчто, кажется, противоречит цели инкапсуляции, предполагая, ConstantB действительно имеет отношение только к классу B, Если вы объявите это таким образом, ConstantB доступен через любое использование Constants класс, в любом типе.

Но если вы согласны с этим и просто пытаетесь убедиться, что объявление константы остается с B класс, тогда выше будет работать.

Другие варианты включают движение вперед и скрытие (используя new ключевое слово) база Constants класс, с незначительным неудобством необходимости указывать базовый класс как полностью квалифицированный для доступа к базовым значениям (например, A.Constants.ConstantA), скрывая базовый класс и имея B.Constants наследование класса A.Constants (требует отказаться от static атрибут класса) или, ИМХО, гораздо лучше, вообще не используя вложенный класс, а вместо этого ставить Constants классы в их соответствующих пространствах имен.

Просто сделайте ваш ConstantA атрибутом вашего родительского класса, поместив этот атрибут во вложенный класс, удалит его из области действия унаследованного класса.

Если вы действительно хотите вложенные классы, вы можете оставить static ключевое слово, и сделать наследование для B.Constants вложенный класс:

public class A 
{
    public class Constants
    {
        public const int ConstantA = 1;
    }
}

public class B : A 
{
    public new class Constants : A.Constants
    {
        public const int ConstantB = 2;
    }
}

Использование будет таким же.

Другие вопросы по тегам