[OOP] Fundamental Principles Part I - Задача 2


13
Условие:

Define abstract class Human with first name and last name. Define new class Student which is derived from Human and has new field – grade. Define class Worker derived from Human with new property WeekSalary and WorkHoursPerDay and method MoneyPerHour() that returns money earned by hour by the worker. Define the proper constructors and properties for this hierarchy. Initialize a list of 10 students and sort them by grade in ascending order (use LINQ or OrderBy() extension method). Initialize a list of 10 workers and sort them by money per hour in descending order. Merge the lists and sort them by first name and last name.

Решение:  GitHub

Обяснение: Клас Human е базов за Student и Worker.

Обединяване на двата обекта var mergedlists = workers.Concat<Human>(students).ToList();

и след това сортиране
             mergedlists = mergedlists.OrderBy(list => list.FirstName).ThenBy(list=> list.LastName).ToList();

Обновено според новите условия

Екип модератори - тагове


в C# OOP от ipenev (1013 точки)


Отговори



3

Ето го моето решение - _клик

Наследяват се полетата и конструкторите. Сортирането е с OrderBy, както се искаше от условието. Единственото, което не ми стана ясно е как(и въобще дали е възможно) да обединя двата листа студенти и работници в обща колекция IEnumerable. В закоментирания код съм зачоплил нещо подобно, но с джойн се създават анонимни обекти и полетата се съединяват, а ние искаме да са си отделно. Закърпих положението като ги сложих в общ dynamic лист, но ако някой знае по-свестен начин моля да сподели.

Ilia Penev - по условие трябва да сортираме с екстеншън методи или LINQ. Последното обединяване и сортиране на двата листа от студенти и работници ти липсва.


от georgi.ivanov (3261 точки)


0
Видях, че има нови условия. Ще ги обновя задачите по-късно.

от ipenev (1013 точки)


1
Ами същото изпълнение правя и аз, но за конкатенирането използвам:
var both = workers.OfType



3

Можем да си предефинираме CompareTo() в класа Human и да ползваме него за сортиране. Клас Human. Демо.


от vic.alexiev (2299 точки)


0
-NICE aa, и аз така ще направя

от ybachev (144 точки)


8

В задачата се изисква класа да е abstract и се чудих как точно е най-правилно да се направи хем да са ти защитени полетата, хем да имаш конструктор, който да се извиква от наследниците и хем да можеш все пак да достъпваш тези имена. 

В крайна сметка си направих полетата private, а конструктора protected както е описано ТУК, защото попринцип не е хубаво да има конструктор в абстрактен клас. Сложих и гетъри от тип protected и по този начин позволих на класовете наследници да достъпват имената си. 

За да мога да достъпвам и имената от други места, без да мога да ги променям, сложих методи в наследниците GetFirstName и GetLastName.

Ето и самото решение: тук


от ScorpS (1542 точки)


0
За проверки от тип: if (firstName != string.Empty && firstName.Length >= 2) можеш да ползваш String.IsNullOrWhiteSpace(value)

от dejan (34 точки)


4
Здравейте аз лично направих merge с
List

от el_b_k (424 точки)


0
и аз така го направих


0
хубаво е че мислиш за това но класа Human трябва да е абстрактен, което означава да не можеш да имаш инстанции от него, затова колегите използват dynamic



1

Ilia Penev много благодаря човече !

students = students.OrderBy(student => student.Grade).ToList();

Това с .ToList() него знаех и много се мъчех.


от RamiAmaire (1868 точки)


0
Другият ти вариант е: students = new List

от nikolaikolarov (2177 точки)


3

Благодарности на колегата Илия Пенев, с това "ToList()" накрая доста ме улесни. Преди това не ми се получаваше и трябваше по доста по-сложен начин да правя задачката.

Домашно.


от tankovski (2828 точки)


1

Здравейте,

Ето и моето решение: Народ/Хора

Може да Ви е полезно създаването на списък с резултатите от Lambda израза (споменах по-нагоре в един коментар за него).

Като цяло съм следвал изцяло логиката на заданието.

Тъй като не беше упоменто изнесох като константа работните дни в седмицата, за да мога правилно да калкулирам заплатата.

 

Поздрави!


от nikolaikolarov (2177 точки)


1

Ето и моето домашно: GitHub

Обяснение:
1.Създавам абстрактният клас Human, който има Име и Фамилия, и пропъртита за тях, които може и да не се пишат, а да се използва съкратения запис.

2.Създавам класа Студенти, който налседява Human. В него има само едно поле - Клас. Пропъртито проверява дали класът е по-голям от 0. Имаме и пренаписан метода ToString(), за да ни изкарва имената и класа на учениците.

3.Създавам и класа Работници, който има три полета - седмична заплата, работни часове за ден и заплата за час работа. В пропъртитата проверявам дали заплатата и часовете не са по-малки или равни на 0. Имаме и метод, който смята колко ще е заплащането за час и го връща като decimal(може и double). Имаме и пренаписан ToString() метод, за да ни показва на конзолата имената и парите за час, които печели работникът.

4.Демото няма да го описвам, защото е с подробни коментари. Само ще кажа, че използвам LINQ, за да подредя хората.


от werew (576 точки)


2

Здравейте,

Моето решение е сходно на другите,но съм си дефинирал сравненията за worker и human  по какъв начин да ги ми сравнява IComparable.Учениците съм ги подредил с OrderBy.

Ето кода.