Передача экземпляра случайного класса нескольким методам

Рейтинг: 0Ответов: 0Опубликовано: 23.02.2023

Помогите, пожалуйста, разобраться с использованием экземпляров классов. Есть класс 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() (если совсем убрать эту строчку, среда разработки выдает ошибку «не все пути к коду возвращают значение»). Подскажите, пожалуйста, что я делаю неправильно?

Ответы

Ответов пока нет.