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

У меня есть два класса, 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;
    }
}

Благодарю вас!


person Antoine Boisier-Michaud    schedule 14.03.2017    source источник
comment
Если ConstantA полезен для всех дочерних классов, почему бы не переместить его внутрь родительского класса вместо внутреннего статического класса?   -  person Alessandro D'Andria    schedule 14.03.2017


Ответы (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 в соответствующие пространства имен.

person Peter Duniho    schedule 14.03.2017

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

person Read Hughes    schedule 14.03.2017

Если вам действительно нужны вложенные классы, вы можете оставить ключевое слово 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;
    }
}

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

person Tóth Tibor    schedule 14.03.2017