Завершить вложенный частичный класс в дочернем классе
У меня есть два класса, 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;
}
}
Использование будет таким же.