Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3419 / 2738 / 575
Регистрация: 04.09.2018
Сообщений: 8,607
Записей в блоге: 3
.NET 4.x

Классы, Наследование, Полиморфизм. Пример решения стандартной задачи "Сотрудники"

29.07.2021, 16:29. Показов 4953. Ответов 11

Студворк — интернет-сервис помощи студентам
По многочисленным просьбам в ЛС помочь с решением почти однотипных задач, написал пример.
Задание звучит так:
Разработать программу на языке С#, которая использует принципы ООП. В программе должны быть реализованы классы начальника,
менеджера и бухгалтера. Все три класса должны быть унаследованы от одного базового класса.
Базовый класс должен реализовывать методы, описанные в двух различных интерфейсах.
Каждый класс должен иметь собственную функцию расчета заработной платы в зависимости от стажа сотрудника.
Необходимо, чтобы для расчета заработной платы использовался следующий механизм:
все созданные экземпляры сотрудников помещаются в один массив и расчет заработной платы сотрудников
осуществляется в едином цикле (реализация механизма полиморфизма).
И так... Интерфейсы:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
//Интерфейсы
        #region <---Interfaces--->
        interface IGetInfo
        {
            void GetInfo();
        }
        interface ICalculatePay
        {
            void CalculatePay();
        }
        #endregion

Базовый класс:
Кликните здесь для просмотра всего текста
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
//Базовый класс Employe
        class Employe : IGetInfo, ICalculatePay
        {
            #region <---Fields--->
            private string name;
            private int age;
            private int number;         //номер
            private int experience;     //стаж работы (кол-во лет)
            private int salary;         //оклад
            private int pay;            //зарплата
            #endregion
 
            #region <---Properties--->
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
 
            public int Age
            {
                get { return age; }
                set { age = value; }
            }
 
            public int Number
            {
                get { return number; }
                set { number = value; }
            }
 
            public int Experience
            {
                get { return experience; }
                set { experience = value; }
            }
 
            public int Salary
            {
                get { return salary; }
                set { salary = value; }
            }
                        
            public int Pay
            {
                get { return pay; }
                set { pay = value; }
            }
            #endregion
 
            #region <---Constructors--->
            public Employe( string n, int a, int num, int exp, int sal )
            {
                this.name = n;
                this.age = a;
                this.number = num;
                this.experience = exp;
                this.salary = sal;
            }
            #endregion
 
            #region <---Methods--->
            //Метод для вывода информации о сотруднике
            //Виртуальный метод, переопределяемый в других классах-наследниках
            public virtual void GetInfo()
            {
                Console.WriteLine( "<--Это метод базового класса - НЕ переопределенный!-->" );
                Console.WriteLine( "Сотрудник: {0}\nЗарплата: {1} р.", name, pay );
                Console.WriteLine( new string( '-', 25 ) );
            }
 
 
            //Виртуальный метод, переопределяемый в других классах-наследниках
            public virtual void CalculatePay()
            {
                //Базовый расчет заработной платы сотрудников с учетом стажа
                //Каждый следующий год доплата повышается на 10% от оклада
                pay = salary + ( salary / 100 * 10 ) * experience;
            }
            #endregion
        }

Класс директора:
Кликните здесь для просмотра всего текста
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
//Класс Директора
        class Director : Employe
        {
            //У директора будет еще необязательное свойство "section" (напр. Директор по персоналу)
            private string Section { get; set; }
 
            public Director( string n, int a, int num, int exp, int sal, string section = "" )
            : base( n, a, num, exp, sal )
            {
                Section = section;
            }
 
            //Переопределенный метод GetInfo() для Директора
            public override void GetInfo()
            {
                Console.WriteLine( "Сотрудник: {0}\nДолжность: Директор {1}\nЗарплата: {2} р.", Name, Section, Pay );
                Console.WriteLine( new string( '-', 25 ) );
            }
 
            //Переопределенный метод CalculatePay() для Директора
            public override void CalculatePay()
            {
                //Каждый следующий год доплата Директору повышается на 20% от оклада
                Pay = Salary + ( Salary / 100 * 20 ) * Experience;
 
                //У Директора надбавочный коэффициент будет 5
                Pay *= 5;
 
                //После подсчета зрЯплаты, сразу выведем информацию в консоль
                GetInfo();
            }
        }

Класс бухгалтера:
Кликните здесь для просмотра всего текста
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
//Класс Бухгалтера
        class Accountant : Employe
        {
            //Конструктор Бухгалтера
            public Accountant( string n, int a, int num, int exp, int sal )
            : base( n, a, num, exp, sal )
            {
            }
 
 
            //Переопределенный метод GetInfo() для Бухгалтера
            public override void GetInfo()
            {
                Console.WriteLine( "Сотрудник: {0}\nДолжность: Бухгалтер\nЗарплата: {1} р.", Name, Pay );
                Console.WriteLine( new string( '-', 25 ) );
            }
 
 
            //Переопределенный метод CalculatePay() для Бухгалтера
            public override void CalculatePay()
            {
                //Каждый следующий год доплата Бухгалтеру повышается на 13% от оклада
                Pay = Salary + ( Salary / 100 * 13 ) * Experience;
 
                //У Бухгалтера надбавочный коэффициент будет 3
                Pay *= 3;
 
                //После подсчета зрЯплаты, сразу выведем информацию в консоль
                GetInfo();
            }
        }

Класс менеждера:
Кликните здесь для просмотра всего текста
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
//Класс Менеждера
        class Manager : Employe
        {
            //Конструктор Менеждера
            public Manager( string n, int a, int num, int exp, int sal )
            : base( n, a, num, exp, sal )
            {
            }
 
            //Метод GetInfo() мы здесь не переопределяем!
 
            //Но, переопределим метод CalculatePay() для Менеждера
            public override void CalculatePay()
            {
                //Вызов Базового метода для Менеждера. Ставка доплаты за стаж не меняется
                //и равна той, что указана в базовом классе (10%)
                base.CalculatePay();
 
                //У Менеждера надбавочный коэффициент будет 2
                Pay *= 2;
 
                //После подсчета зрЯплаты, сразу выведем информацию в консоль
                GetInfo();
            }
        }

В основной программе создадим Директора, двух Бухгалтеров и двух Менеджеров:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static void Main( string[] args )
        {
            Employe[] empl = new Employe[ 5 ];
 
            empl[ 0 ] = new Director( "Джон Уик", 42, 1, 10, 50700, "по персоналу" );
            empl[ 1 ] = new Accountant( "Ольга", 25, 2, 7, 32500 );
            empl[ 2 ] = new Accountant( "Наталья", 36, 3, 2, 32500 );
            empl[ 3 ] = new Manager( "Вася Пупкин", 22, 10, 0, 22400 );
            empl[ 4 ] = new Manager( "Петя Иванов", 19, 11, 1, 22400 );
 
            //А здесь рассчитаем зарплаты всех сотрудников и выведем на консоль 
            foreach ( Employe e in empl )
            {
                e.CalculatePay();
            }
 
            Console.Read();
        }

Результат работы:

Все.
Пожалуйста, по всем вопросам касательно данного примера - пишите в эту ветку форума, а не в ЛС.
1
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.07.2021, 16:29
Ответы с готовыми решениями:

Классы, наследование, полиморфизм и инкапсуляция: нужен пример использования
Пожалуйста , у кого есть приложение где задействованы классы. а именно наследование , полиморфизм и инкапсуляция, напишите код или готовое...

решение задачи Конструкторы и деструкторы, Наследование, Множественное наследование. Полиморфизм
Задания такие Что зачеркнуто вроде сделано правильно) Если есть люди добрые не могли бы вы помочь? Лабораторная работа № 2....

Классы / наследование / полиморфизм
Решите, если несложно, программа вроде довольно простая..., но с с++, я пока неочень... Добавлено через 36 минут вот что я...

11
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
29.07.2021, 16:45
wizard41, почему для денежных единиц используется int, а не какой-нибудь decimal?

Цитата Сообщение от wizard41 Посмотреть сообщение
salary / 100 * 10
Сдается мне, для int ничего хорошего в этом расчете не будет, особенно учитывая, что умножение тут после деления.
1
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
29.07.2021, 16:53
Цитата Сообщение от wizard41 Посмотреть сообщение
По многочисленным просьбам

Не по теме:


Напоминает фразу у начинающих youtube-еров: "Меня часто спрашивают о...И вот я решил поделиться с вами ответом в этом видео" ;)

0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
29.07.2021, 16:56
wizard41, еще небольшой совет. Для подобного контента можно воспользоваться блогами, так как их можно редактировать, если требуется внести изменения.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3419 / 2738 / 575
Регистрация: 04.09.2018
Сообщений: 8,607
Записей в блоге: 3
29.07.2021, 18:48  [ТС]
Цитата Сообщение от QuakerRUS Посмотреть сообщение
для int ничего хорошего в этом расчете не будет
Я в курсе. Но это же просто пример реализации а не точных расчетов.

Добавлено через 4 минуты
IamRain, кому бы что это не напоминало, а суть такова: вопрос должен быть обсуждаем всеми заинтересованными лицами. А рассылкой ответов посредством ЛС я не занимаюсь. Может люди стесняются задавать такие вопросы на форуме или еще что. Я не знаю.

Добавлено через 1 час 26 минут
Цитата Сообщение от QuakerRUS Посмотреть сообщение
можно воспользоваться блогами
А вот про это я как-то не подумал. Ну тему я удалить не могу.
0
249 / 79 / 31
Регистрация: 29.03.2020
Сообщений: 497
29.07.2021, 21:36
Цитата Сообщение от wizard41 Посмотреть сообщение
Ну тему я удалить не могу.
Так она сама утонет
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
29.07.2021, 21:38
Лучший ответ Сообщение было отмечено wizard41 как решение

Решение

transetor, неа, сюда будут регулярно заглядывать и просить переделать что бы (без/с) того или этого, с просьбами решить другую, но очень похожую задачу
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3419 / 2738 / 575
Регистрация: 04.09.2018
Сообщений: 8,607
Записей в блоге: 3
29.07.2021, 22:07  [ТС]
Цитата Сообщение от transetor Посмотреть сообщение
Так она сама утонет
И не вам ее поднимать со дна. Так какая разница? Просто пу*нуть в лужу?

Добавлено через 50 секунд
Цитата Сообщение от transetor Посмотреть сообщение
удалить не могу
Нет таких полномочий, имелось в виду. В блог бы засунул.
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
03.08.2021, 12:21
я понимаю что это пример для начнающих, но все же: нужно ли использовать Console.WriteLine() внутри методов классов-сущностей?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3419 / 2738 / 575
Регистрация: 04.09.2018
Сообщений: 8,607
Записей в блоге: 3
03.08.2021, 12:47  [ТС]
Цитата Сообщение от NewOrdered Посмотреть сообщение
нужно ли использовать Console.WriteLine() внутри методов классов-сущностей?
конечно нет. Но их не трудно вынести наружу )
0
03.08.2021, 12:52

Не по теме:

wizard41, извините, но начинающие этим заниматься точно не будут

0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3419 / 2738 / 575
Регистрация: 04.09.2018
Сообщений: 8,607
Записей в блоге: 3
03.08.2021, 14:09  [ТС]
NewOrdered, Так покажите пример

Добавлено через 1 час 7 минут
В задании второго спрашивающего было сказано что-то типа: "В классе должен быть определен метод вывода на консоль". Вот я и объединил это все. Люди фиить... и исчезли, видимо прокатило
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.08.2021, 14:09
Помогаю со студенческими работами здесь

Разбить на классы и ввести наследование и полиморфизм
Помогите пожалуйста, как это программу разбить на классы и ввести полиморфизм и наследование? ввожу класс random1 и программа перестает...

Классы. Абстрагирование. Наследование. Инкапсуляция. Полиморфизм
Реализовать класс согласно заданию (объекты класса должны обладать не менее 5 различными свойствами и 5 различными методами, оказывающими...

Абстрактные классы, наследование, полиморфизм и интерфесы
Помогите, пожалуйста, решить задание. Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм для следующих...

Использовать возможности ООП: классы, наследование, полиморфизм, инкапсуляция
Создать консольное приложение, удовлетворяющее следующим требованиям: Использовать возможности ООП: классы, наследование, полиморфизм,...

Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм
Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм для следующих классов: interface Учебное Заведение...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта 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 На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru