C# Получить поле наследника абстрактного класса
У меня есть абстрактный класс Part и я хочу получить доступ к полям его наследников. Я создаю объект наследника, но взамен получаю ошибку, что ссылка на объект не указывает на экземпляр объекта, хотя в отладке переменная имеет тип наследника
public struct information
{
public string structure;
public string latin;
public string functions;
public string clinical_significance;
}
public abstract class Part
{
public Crown cr;
public Cerebellum cer;
public Forehead fr;
public Occiput occ;
public Temporal tmp;
}
public class Crown:Part
{
public const int id = 110;
public information inf_crw;
public string crown_part;
public string lateral_intraparietal_area;
public string ventral_intraparietal_area;
public string medial_intraparietal_area;
public string front_intraparietal_area;
public Crown()
{
crown_part = "crw_part";
inf_crw.structure = "crw_struct";
inf_crw.latin = "crw_lat";
inf_crw.functions = "crw_func";
lateral_intraparietal_area = "crw_1";
ventral_intraparietal_area = "crw_2";
medial_intraparietal_area = "crw_3";
front_intraparietal_area = "crw_4";
inf_crw.clinical_significance = "crw_clinic";
}
private Part GetPart(int id)
{
switch (id)
{
case Crown.id:
return new Crown();
case Cerebellum.id:
return new Cerebellum();
case Forehead.id:
return new Forehead();
case Occiput.id:
return new Occiput();
default:
return new Temporal();
}
}
Здесь я использую класс Part для создания экземпляра класса его наследника и заполнить этой информацией форму, в режиме говорится, что temp имеет тип Crown(по-другому он даже не зашел бы в if
public PartInfoForm(int selected_id)
{
InitializeComponent();
Part temp = GetPart(selected_id);
//Console.WriteLine(temp.GetType());
if (temp.GetType() == typeof(Crown))
{
label1.Text = temp.cr.crown_part.ToString();
}
//label1.Text = temp.;
}
EDIT: Проблема даже не в том, что я получаю NullPointerException, а в том, как мне получить поля наследника
Ответы (1 шт):
Привести к типу наследника и обращаться к полям.
if (temp is Crown crown)
{
label1.Text = crown.cr.crown_part.ToString();
}
Но я не понимаю, как поля типа нследника оказались в родителе. Это обнуляет весь смысл абстракций. Другими словами у вас бардак в модели данных, обфусцированные названия членов классов и самих классов затрудняют понимание кода до уровня невозможного.