Профил
Loading...
+ Нов въпрос
GalyaGeorgieva avatar GalyaGeorgieva 88 Точки

[Homework] OOP - Inheritance and Abstraction - юни 2015

Отварям тема и за домашното за  наследяването, че тук ще е голямото писане и обсъждане.

ТУК са моите решения на задача 1 и задача 2.

Задача 3 - Done

 

Edit: От коментарите на yanchev_i  и на nikola.m.nikolov успях да дооправя кода. Благодаря и на двамата и ако имате време огледайте го отново, възможно е да съм пропуснала да фиксна нещо.

Edit: Добавих и Enumerator за Gender в клас Cat и съответно се наследи от Kitten i Tomcat... пак с наставленията на nikola.m.nikolov. :)

Кодът е ТУК.

Тагове:
4
C# OOP Basics 10/06/2015 21:26:08
yanchev_i avatar yanchev_i 16 Точки

Здравей,

за задача 2 в условието е посочено, че трябва да се даде усреднената възраст за всеки един вид отделно, а не за всички животни, т.е. първо да се групират и после да се изчисли:

            foreach (var kind in allAnimal.GroupBy(x => x.GetType()))
            {
                double averageAge = kind.Select(x => x.Age).Average();
                Console.WriteLine("Animal : {0}, AverageAge: {1}", kind.Key, averageAge);
            }

Също така дали не е по-удачно интерфейса ISoundProducible да се имплементира на главния клас Animal, и да се унаследява надолу, тъй като той е присъщ за всички подкласове?

Поздрави,

И.

1
GalyaGeorgieva avatar GalyaGeorgieva 88 Точки

Да, наистина е по-прегледно интерфейсът да е имплементиран в абстрактния клас  Animal. Ще го поправя. Що се отнася до усреднената възраст вероятно не съм прочела добре условието, така че и него ще фикс-на.
Благодаря!

 

0
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

Хубаво е абстрактните класове да имат protected конструктори. Вторият ми съвет е винаги да използваш interface-и т.е. вместо List<Animal> използвай IList<Animal>. На класовете винаги слагай Access Modifier-ите. Винаги използвай this. Магическите числа ги изкарвай в константи. Пример:

if (value.ToString().Length < 5 || value.ToString().Length > 10)

5 и 10 са такива числа. А и после ги използваш при хвърлянето на грешката, така че ако са константа ще е още по-удобно.

2
09/06/2015 17:21:55
GalyaGeorgieva avatar GalyaGeorgieva 88 Точки

Водейки се от съветите и забележките коригирах кода. Благодаря!

п.п може нещо да съм пропуснала, защото да си призная Access Modifiers са ми леко в мъгла и някои правила при наследяването ми убягват

0
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

Доста по-добре е. Другият ми съвет е Gender да ти е Enumerator.

1
trysth avatar trysth 44 Точки

nikola.m.nikolov, гледах в решенията на предишните групи, че също използват Enumerators,  за да дефинират в случая gender, department в зад. 3 и тн. Това ли е правилния начин? Питам, защото не сме ги учили и искам да знам, дали да им обърна внимание.

0
Viktor_Boyanov avatar Viktor_Boyanov 21 Точки

Едно въпросче, защо създаваш този interface в първата задача? Не може ли да се използва FirsName и LastName от абстрактния клас Human?

0
09/06/2015 23:19:30
WindWallk avatar WindWallk 95 Точки

Може, просто се заиграх и забравих да го премахна и да го върна само в първия клас да е така

0
nstanevski avatar nstanevski 37 Точки

Just my 2 cents:

1. Котките могат да бъдат или мъжки (Tomcat) или женски (Kitten). Следователно, класът Cat може да е абстрактен и да има Gender в конструктора си. Tomcat наследява Cat инициализирайки Gender = Gender.Male, а Kitten - Gender.Female. Не че твоят подход е грешен, но по този начин дизайнът става една идея по-абстрактен.

2. В animals.cs към  GetType() може да добавиш свойството Name, т.е. да извикваш GetType().Name и по този начин ще получиш името на типа без префикс за namespace.

0
GalyaGeorgieva avatar GalyaGeorgieva 88 Точки

И по двете точки има резон. Да си призная и аз се чудех дали Cat да го правя abstract и реших, че някой може да иска да си направи безполова котка :)  За GetType() ще го променя, защото наистина ще изглежда по-прегледно. :)

0
sashkooooy avatar sashkooooy 26 Точки

Здравейте, аз имам един проблем с трета задача (Company Hierarchy)... В Main метода създавам manager, към него добавям developer и му създавам няколко проекта и след като пусна програмата, на конзолата ми изкарва информация само за мениджъра... Предполагам, че грешката ми е някаде в override на ToString(), но не съм сигурен, още не мога да го разбера как да ми изкарва цялата йерархия. Ето линк към задачката:

https://github.com/sashkooooy/MyRepo/tree/master/Homework3-InheritanceAndAbstraction/3.CompanyHierarchy

Ще се радвам ако някой ми помогне да схвана логиката :).

0