Переопределение атрибутов свойств

#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 🙂