Обяснение на задачите/упражненията от домашното към лекцията Принципи на ООП – част I от курса ООП в Академията. Засягат се основни и много важни теми като наследяването на класовете, абстракцията, интерфейсите и тяхното значение, енкапсулацията на данните, как да си направим клас диаграми във VS, така че по-лесно да се ориентираме кой клас от кого точно се наследява и т.н.
{ Кодът с решенията към всяка една от задачите можете да видите тук }
1. We are given a school. In the school there are classes of students. Each class has a set of teachers. Each teacher teaches a set of disciplines. Students have name and unique class number. Classes have unique text identifier. Teachers have name. Disciplines have name, number of lectures and number of exercises. Both teachers and students are people. Students, classes, teachers and disciplines could have optional comments (free text block).
Your task is to identify the classes (in terms of OOP) and their attributes and operations, encapsulate their fields, define the class hierarchy and create a class diagram with Visual Studio.
ОБЯСНЕНИЕ: Първото нещо, което правя е class-а за класа да го кръстя SchoolInClass, за да не се бърка със системния Class. Този клас, както и класа School и Human (в условието се казва, че Учителят и Студента са „people“ т.е. наследяват общ клас) ги правя абстрактни, за да не може от тях да се инстанцират нови обекти. Студентът и Учителят ще наследяват класа Human. Относно метода за Коментари е доста трудно да се определи, дали да бъде направен чрез интерфейс, абстрактен метод или vurtual метод…Аз предпочетох да го направя с интерфес IComment.
2. 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.
ОБЯСНЕНИЕ: Cъздавам абстрактен клас Human (по условие се изисква, а и не е редно класа Human да се инстанцира), който се явява баща на класовете Student и Worker. В тях си слагам полетата и пропъртитата, така както са описани по условието. Добавям и конструктора тук, за да си спестя последващо писане при наследяването от другите класове, като не го правя public, а protected, за да се ползва само от наследниците. Правя си съответните валидации. Оverride-ването на ToString() метода го правя първо в Human, а след това и в Student и Worker с новите им полета. По интересното в тази задача е обединението на двата листа от студенти и работници, като аз го правя с List<Human> и после чрез AddRange ги обединявам в един лист. Различните сортирания на студентите и работниците ги правя чрез LINQ (OrderBy).
3. Create a hierarchy Dog, Frog, Cat, Kitten, Tomcat and define useful constructors and methods. Dogs, frogs and cats are Animals. All animals can produce sound (specified by the ISound interface). Kittens and tomcats are cats. All animals are described by age, name and sex. Kittens can be only female and tomcats can be only male. Each animal produces a specific sound. Create arrays of different kinds of animals and calculate the average age of each kind of animal using a static method (you may use LINQ).
ОБЯСНЕНИЕ: Animal е базов абстрактен клас за всички животни. Kitten и Tomcat наследяват класа Cat, който не съм го направил да е абстрактен (т.е. може да си има просто инстанция на класа Cat). В интерфейса ISound се помещава метода ProduceSound, който кара животните да говорят, всяко според типа си, който го взимаме чрез GetType().Name. За определяне на пола използвам енумерация, като за Kitten и Tomcat той е фиксиран по условие още в констуктора. Задължително статичният метод по условие AvarageAge съм го поместил в класа Animal, който прави свойте изчисленията си чрез LINQ израз (.Avarage).
Кодът към всяка една от задачите можете да видите тук.