Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
13 / 13 / 5
Регистрация: 21.06.2013
Сообщений: 128

Задача на наследование и полиморфизм: иерархия классов Person-Student-Teacher

28.05.2014, 13:12. Показов 7245. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. На просторах интернета нашел задачу по шарпу:
Кликните здесь для просмотра всего текста
2.1. Создать иерархию классов Person-Student-Teacher. Каждый класс – в своей сборке. В каждом классе должны быть свойства, а также виртуальная функция Print и переопределенная функция ToString(). Основная программа создает массив объектов Person или их наследников, после чего выдает его на экран. У каждого Teacher должен быть список Students, которыми он руководит, у каждого Student - Teacher, который им руководит.
Замечание. В процессе реализации возникнет такая ошибка как циклическая зависимость сборок: сборка Student зависит от сборки Teacher и наоборот. Для устранения этой ошибки рекомендуется создать класс Student без поля Teacher, после чего создать производный класс StudentWithAdvisor с полем Teacher в отдельной сборке.
2.2. Для классов Person-Student-Teacher реализовать и оттестировать ToString(), Equals(), GetHashCode().
2.3. Для классов Person-Student-Teacher реализовать статические методы RandomPerson, RandomStudent, RandomTeacher, которые возвращают случайного из некоторого статического массива.
2.4. С помощью is, as, GetType определить, сколько в массиве персон, студентов и преподавателей и перевести всех студентов на следующий курс.
2.5. Для классов Person-Student-Teacher реализовать глубокое клонирование, определив виртуальный метод Clone(). Клон должен возвращать точную копию по значению и типу. Проиллюстрировать Clone на примере контейнера персон - должны создаваться клоны объекты ровно тех типов, которые содержатся в исходном контейнере.
2.6. Используя метод GetType() класса Student и метод BaseType() класса Type, вывести всех предков класса Student (написать общий метод)

Замечание 1. Свойства ("умные" поля) определяются так:
C#
1
2
3
4
5
private int age;
public int Age {
  get { return age; }
  set { if (value<0) value = 0; age = value; }
}
Здесь value - переменная, неявно объявленная в каждом сеттере. Свойства отличаются от полей тем, что при доступе на чтение и запись можно совершать дополнительные действия. Обычная практика - проверка в сеттере значения на допустимость и его исправление или генерация исключения.
Замечание 2. В конструкторе потомка следует вызывать конструктор предка в списке инициализации:
C#
1
Student(...): base(...) {}
Замечание 3. Виртуальные функции следует объявлять с ключевым словом virtual в предке и с ключевым словом override в потомках. Виртуальную функцию следует вызывать через переменную базового класса:
C#
1
2
Person p = new Student(...);
p.Print();
Замечание 4. Функции ToString() и Equals() определены в базовом классе Object как виртуальные.
Замечание 5. p is Student возвращает True если в p - студент или производный класс. p as Student преобразует тип p к Student, а если это невозможно, возвращает null.
Замечание 6. Для сравнения на точное совпадение типа используется GetType:
C#
1
if (p.GetType()==typeof(Student))

Создать обычные классы со свойствами, проблемы не составляет. Унаследовать тоже не проблема. Если делать по заданию, я бы создал 3 класса, в главной программе сделал массив учеников. В классе Ученик - есть свойство с именем учителя. А в классе Учитель - сделал бы список студентов, которых пришлось бы потом добавлять из массива.
Вопросы возникают следующие:
1) Как для классов Person-Student-Teacher реализовать статические методы RandomPerson, RandomStudent, RandomTeacher, которые возвращают случайного из некоторого статического массива? допустим в классе Учитель я могу сделать выбор рендомного ученика, т.к. есть список. А как реализовать метод в классе, который будет выбирать любого ученика, учителя из массива, который создается в основной программе?
2) И как используя свойства сделать добавление/удаление/чтение элементов списка? Или вообще не обращать внимания, что есть приватный список, а описать свойства класса Учитель как "добавление записи", "удаление записи", "получение всего списка"?
Больше даже не проблема в реализации, а проблема в понимании текущей задачи...

Пока сделал такое:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
    class Person
    {
        private byte age;
        private string first_name;
        private string last_name;
 
        public byte Age
        {
            get
            {
                return age;
            }
            set
            {
                age = value;
            }
        }
 
        public string First_name
        {
            get
            {
                return first_name;
            }
            set
            {
                first_name = value;
            }
        }
 
        public string Last_name
        {
            get
            {
                return last_name;
            }
            set
            {
                last_name = value;
            }
        }
 
        virtual public void Print()
        {
            Console.WriteLine("Имя: " + first_name);
            Console.WriteLine("Фамилия: " + last_name);
            Console.WriteLine("Возраст: " + age);
        }
 
        public override string ToString()
        {
            string str = "Имя: " + first_name + "; " + "Фамилия: " + last_name + "; " + "Возраст: " + age;
            return str;
        }
    }
 
    class Student : Person
    {
        private string teacher;
        private string gruppa;
        private byte kurs;
 
        public string Teacher
        {
            get
            {
                return teacher;
            }
            set
            {
                teacher = value;
            }
        }
 
        public string Gruppa
        {
            get
            {
                return gruppa;
            }
            set
            {
                gruppa = value;
            }
        }
 
        public byte Kurs
        {
            get
            {
                return kurs;
            }
            set
            {
                kurs = value;
            }
        }
 
        public override void Print()
        {
            Console.WriteLine("Имя: " + base.First_name);
            Console.WriteLine("Фамилия: " + base.Last_name);
            Console.WriteLine("Возраст: " + base.Age);
            Console.WriteLine("Учитель: " + Teacher);
            Console.WriteLine("Группа: " + Gruppa);
        }
    }


Если у кого то есть время и желание подсказать - буду очень благодарен

Добавлено через 1 час 44 минуты
В общем получается что-то очень отдаленно напоминающее задание:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
class Person
    {
        private byte age;
        private string first_name;
        private string last_name;
 
        public byte Age
        {
            get
            {
                return age;
            }
            set
            {
                age = value;
            }
        }
 
        public string First_name
        {
            get
            {
                return first_name;
            }
            set
            {
                first_name = value;
            }
        }
 
        public string Last_name
        {
            get
            {
                return last_name;
            }
            set
            {
                last_name = value;
            }
        }
 
        virtual public void Print()
        {
            Console.WriteLine("Имя: " + first_name);
            Console.WriteLine("Фамилия: " + last_name);
            Console.WriteLine("Возраст: " + age);
        }
 
        public override string ToString()
        {
            string str = "Имя: " + first_name + "; " + "Фамилия: " + last_name + "; " + "Возраст: " + age;
            return str;
        }
    }
 
    class Student : Person
    {
        private string teacher;
        private string gruppa;
        private byte kurs;
 
        public string Teacher
        {
            get
            {
                return teacher;
            }
            set
            {
                teacher = value;
            }
        }
 
        public string Gruppa
        {
            get
            {
                return gruppa;
            }
            set
            {
                gruppa = value;
            }
        }
 
        public byte Kurs
        {
            get
            {
                return kurs;
            }
            set
            {
                kurs = value;
            }
        }
 
        public override void Print()
        {
            Console.WriteLine("Имя: " + base.First_name);
            Console.WriteLine("Фамилия: " + base.Last_name);
            Console.WriteLine("Возраст: " + base.Age);
            Console.WriteLine("Учитель: " + Teacher);
            Console.WriteLine("Группа: " + Gruppa);
        }
    }
 
    class Teacher: Person
    {
        private List<Student> list_student = new List<Student>();
 
        public void AddStudent(Student student)
        {
            list_student.Add(student);
        }
 
        public bool RemoveStudent(Student student)
        {
            //var test=list_student.Select(x => x == student);
            if (list_student.Exists(x=>x==student))
            {
                return list_student.Remove(student);
            }
            else
            {
                return false;
            }
        }
 
        public override void Print()
        {
            Console.WriteLine("Учитель: "+base.Last_name);
            Console.WriteLine("Возраст: " + base.Age);
            Console.WriteLine("Студенты: ");
            byte count = 0;
            foreach (var student in list_student)
            {
                Console.WriteLine(count + ")");
                student.Print();
                Console.WriteLine();
                count++;
            }
            Console.WriteLine("----------------------------------------------------");
            Console.WriteLine();
            
        }
    }


И использование:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
List<Student> students = new List<Student>();
            List<Teacher> teacher = new List<Teacher>();
 
            students.Add(new Student() { Age = 22,First_name = "Имя", Last_name = "Фамилия", Gruppa = "KSM-08-5", Kurs = 6, Teacher = "Фамилия1"});
            students.Add(new Student() { Age = 23, First_name = "Имя", Last_name = "Фамилия", Gruppa = "KSM-08-5", Kurs = 6, Teacher = "Фамилия2" });
            students.Add(new Student() { Age = 23, First_name = "Имя", Last_name = "Фамилия", Gruppa = "KSM-08-5", Kurs = 6, Teacher = "Фамилия3" });
            students.Add(new Student() { Age = 23, First_name = "Имя", Last_name = "Фамилия", Gruppa = "KSM-08-5", Kurs = 6, Teacher = "Фамилия1" });
 
            teacher.Add(new Teacher() { Age = 65, First_name = "Имя", Last_name = "Фамилия1" });
            teacher.Add(new Teacher() { Age = 63, First_name = "Имя", Last_name = "Фамилия2" });
            teacher.Add(new Teacher() { Age = 60, First_name = "Имя", Last_name = "Фамилия3" });
 
            for (int i = 0; i <= students.Count - 1; i++)
            {
                for (int j = 0; j <= teacher.Count - 1; j++)
                {
                    if (teacher[j].Last_name == students[i].Teacher)
                    {
                        teacher[j].AddStudent(students[i]);
                    }
                }
            }
            foreach (var teacher1 in teacher)
            {
                teacher1.Print();
            }
            Console.Read();
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.05.2014, 13:12
Ответы с готовыми решениями:

Задача на множественное наследование, иерархия классов
Создать класс хвост, имеющий в качестве параметров длину и вид(строка). Определить конструкторы и метод доступа. Создать класс хвостатое...

Определить новые версии классов Exam, Person и Student
Подскажите, пожалуйста! Определить интерфейс interface IDateAndCopy { object DeepCopy(); DateTime Date { get; set; } } Определить...

Реализовать иерархию классов: базовый клас Person и производные классы Worker и Student
Здравствуйте, у меня тут проблема выходит, не могу понять из-за чего, может объясните, сама задача выглядит следующим образом | Создайте...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.05.2014, 13:12
Помогаю со студенческими работами здесь

Иерархия классов , наследование
Помогите сделать все с классами.Я функции все сделал , все работает.Надо бы создать иерархию и как-то соединить все.Тут у меня...

Наследование и полиморфизм классов
Доброго времени суток. Суть задания определить иерархию классов; Классы - тест, экзамен, выпускной экзамен, испытание; я так...

Множественное наследование. Иерархия классов
Создать классы фигура, четырехугольник, квадрат и прямоугольник. Создать из них иерархию. Определить функции печати, конструкторы и...

Наследование, полиморфизм, создание классов
Доброго времени суток, у меня возник вопрос , опять же по данной теме. Есть код. Задание было таким: Написать программу, в...

Наследование классов. Полиморфизм. Действия над матрицами
Здравствуйте! Существует такая проблема, реализуется класс матрица, где базовый класс создает заполняет и выводит матрицы, а производные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru