При наследовании, вызывая метод дочернего элемента 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);
}
Судя по всему, вы не понимаете что делает:
public new static int[] Indexs = new int[13];
Поясню, эта строчка не перезаписывает поле Indexs в классе BBB. Эта строчка создаёт новое поле, с новым именем, и с новым адресом в памяти. Далее, ваш родительский метод, как и обращался к своему _BBB_Indexs полю, так и обращается, а то что вы ввели _AAA_Indexs - картину не изменило. Это РАЗНЫЕ поля.
Вариант 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 - создать интерфейс, и определять методы по нему.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости