Передача экземпляра случайного класса нескольким методам
Помогите, пожалуйста, разобраться с использованием экземпляров классов. Есть класс Person и наследующиеся от него классы Tom, Ban, Pit, Jack (в них переопределяются отдельные поля и функции родительского класса, в том числе методы Name(), Age() и Epitaph()). Программа должна выбирать случайным образом один из классов-наследников, после чего с этим наследником должны работать несколько функций. Пример классов:
// Родитель
internal class Person
{
public string Name()
{
int random_index = rand.Next(2);
var name = new List<string>(2)
{
"Black",
"White"
};
return ("Фамилия: " + name[random_index]);
}
}
// Класс-наследник
internal class Tom : Person
{
public new string Name()
{
int random_index = rand.Next(2);
var name = new List<string>(2)
{
"Daw",
"Smith"
};
return ("Фамилия: " + name[random_index]);
}
}
Случайный выбор реализован так:
private Person ChosenCase = GetRandomPerson();
private static Person GetRandomPerson()
{
Random rand = new Random();
int man_choice = rand.Next(1, 5);
switch (man_choice)
{
case 1:
return new Tom();
case 2:
return new Ban();
case 3:
return new Pit();
case 4:
return new Jack();
}
return new Person();
}
Функции реализуются так:
public void MakeButtons()
{
List<string> features = new List<string>(3)
{
"Имя",
"Возраст",
"Эпитафия"
};
foreach (var item in features)
{
Button btn = new Button();
btn.Text = item;
btn.Click += (x, args) => LifeResult(ChosenCase, item); // при нажатии должно выводиться значение поля дочернего класса
flowLayoutPanel1.Controls.Add(btn);
}
}
private void LifeResult(Person ChosenCase, string item)
{
Label newLabel = new Label();
switch (item)
{
case "Имя":
newLabel.Text = ChosenCase.Name();
break;
case "Возраст":
newLabel.Text = ChosenCase.Age();
break;
case "Эпитафия":
newLabel.Text = ChosenCase.Epitaph();
break;
default:
newLabel.Text = "Вы задали непонятный вопрос!";
break;
}
flowLayoutPanel2.Controls.Add(newLabel);
}
Проблема в том, что функции выводят значения полей и результаты работы методов родительского класса, а не наследников. Это происходит даже если заменить в методе случайного выбора return new Person() на return new Jack() (если совсем убрать эту строчку, среда разработки выдает ошибку «не все пути к коду возвращают значение»). Подскажите, пожалуйста, что я делаю неправильно?