C# наследуемый метод работает с родительскими полями

253
04 ноября 2017, 11:58

При наследовании, вызывая метод дочернего элемента AAA он продолжает работать с полями родительского класса BBB, а не дочернего. Как это исправить

Этот код работает как надо

public class AAA : BBB
{
    public new static string[] Titles =
    {
        "а","б", "в"
    };
    public new static int[] Indexs = new int[13];
     public static void A(string[] x)
    {
        Indexs[0] = Titles.Length;
    }
}
public class Excel
{
    public List<AAA> Профиль = new List<AAA>();
    ...
    AAA.A(titleRow);
}

А как сделать наследование, чтобы работало как в первом примере?

Т.е. код показанный ниже не работает

public class BBB
{
    public static string[] Titles;
    public static int[] Indexs;
    public static void A(string[] x)
    {
        Indexs[0] = Titles.Length;
    }
}
public class AAA : BBB
{
    public new static string[] Titles =
    {
        "а","б", "в"
    };
    public new static int[] Indexs = new int[13];
}
public class Excel
{
    public List<AAA> Профиль = new List<AAA>();
    ...
    AAA.A(titleRow);
}
Answer 1
  1. Судя по всему, вы не понимаете что делает:

    public new static int[] Indexs = new int[13];
    

Поясню, эта строчка не перезаписывает поле Indexs в классе BBB. Эта строчка создаёт новое поле, с новым именем, и с новым адресом в памяти. Далее, ваш родительский метод, как и обращался к своему _BBB_Indexs полю, так и обращается, а то что вы ввели _AAA_Indexs - картину не изменило. Это РАЗНЫЕ поля.

  1. Для решения данной задачи, вы должны использовать ООП. Вам надо избавиться от static, далее, у вас несколько способов решения проблемы.

Вариант 1 - создать метод public int[] getIndexs(), определить его в BBB, и перезаписать его в AAA, при этом, остальной код в BBB обязан работать только с getIndexs(), и не лезть в поле напрямую. Так ваши new поля смогут быть перезаписаны (хотя, лично я не вижу в этом смысла... удобнее перезаписать сами методы, или изменить адрес значения полей у BBB, нежели создавать новые поля у ААА и переопределять родительские методы)

public class BBB
{
    public virtual string[] Titles { get; set; }
    public virtual int[] Indexs { get; set; }
    public BBB(string[] titles, int[] indexs) : base()
    {
        Titles = titles;
        Indexs = indexs;
    }
    public void A(string[] x)
    {
        Indexs[0] = Titles.Length;
    }
}
public class AAA : BBB
{
    public AAA() : base(new string[]{"а","б", "в"}, new int[13])
    {
    }
}
public class Excel
{
    public List<AAA> Профиль = new List<AAA>();
    ...
    AAA.A(titleRow);
}

Вариант 2 - создать интерфейс, и определять методы по нему.

READ ALSO
DataGridView checkbox column с привязкой к SQLite

DataGridView checkbox column с привязкой к SQLite

ПриветствуюЕсть DataGridView, в которую загружаются данные из БД SQLite:

270
Перезапись элементов List

Перезапись элементов List

Доброго времени сутокИмеется следующий код генерации перестановок:

223
Пиксельная мозаика из картинки

Пиксельная мозаика из картинки

Всем привет! Помогите разобраться с реализацией в C# Необходимо сделать следующее: 1Загрузить картинку (любого размера) 2

253
XML-сериализация по особым правилам

XML-сериализация по особым правилам

Имеется электронный документооборотОбмен данными выполняется с помощью XML следующей структуры:

282