#c# #inheritance #attributes
#c# #наследование #атрибуты
Вопрос:
У меня есть базовый класс с полем:
class Base
{
public int A;
public int ShowA()
{
Console.WriteLine(A);
}
}
У меня есть производный класс:
class Derived : Base
{
public Derived()
{
A = 5;
}
}
Я использую графический редактор, который показывает все поля для класса. Поскольку Derived
устанавливает A
в своем конструкторе, я не хочу, чтобы это отображалось в редакторе. Редактор не вводит атрибут have [HideInInspector()]
в поля.
Как я могу заставить Derived
иметь его A
свойство с [HideInInspector()]
атрибутами, в то время как Base
этого не будет?
Я не могу использовать ключевое слово, new
потому что я хочу, чтобы Base
по-прежнему использовалось то же поле, что и Derived
в его функциях (например, (new Derived()).ShowA()
будет печатать 5
).
Редактировать: Это выглядит как трюк со свойствами и new
не будет работать, потому что редактор графического интерфейса обрабатывает поля с new
дважды (один раз для базового и один раз для производного).
Ответ №1:
Попробуйте это
class Base
{
public virtual int A {get; set;}
public int ShowA()
{
Console.WriteLine(A);
}
}
class Derived : Base
{
public Derived()
{
A = 5;
}
[HideInInspector()]
public override int A
{
get { return base.A;}
set { base.A = value}
}
}
Комментарии:
1. Могу я, пожалуйста, спросить вас, что
HideInInspector()
делает?2. Концепция @Uw как я уже говорил в вопросе, редактор графического интерфейса не будет отображать поля с
HideInInspector()
(это не Visual Studio).3. @Jon это действительно работает, я сказал, что не могу его использовать, потому что это разделит значения, но здесь этого не будет.
4. На самом деле это не сработает … редактор графического интерфейса достаточно умен, чтобы включать свойства с
new
двойным (базовым и производным) значением, которое не показывает производное, но все еще показывает базовое.5. @Dani: Я вижу, это моя ошибка. Дал 1 🙂