Loading...

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

ttitto avatar ttitto 1153 Точки

[Homework] OOP - Inheritance and Abstraction - Септември 2014

Ето го и домашното от тази тема:

Animals

HumanSystem

SchoolSystem

В един общ проект съм направил последните две задачи:

WordReportGenerator - реших да го направя на WPF Application, което доста ме забави. За XAML си е нужен направо един двуседмичен фаст трак според мен.

Класовата структура на компанията е готова на 100%, а от 5 та задача е готово импортирането на данни и генерирането на репорти за Word. Надявам се утре да имам време да пооправя кода и UI, че е много грозно в момента, както и да направя DropBox функционалността.

Този път задачите ми не са много изпипани, така че се надявам на широка дискусия!

12
C# OOP Basics
borislavml avatar borislavml 368 Точки

Привет. Не се стърпях и веднага погледнах 3-та задача (Animals) да видя как си пресметнал avarage age на животните. Вчера се измъчих с едни if statement-и да проверяам кое животно какво е, и тогава да му смятам age, и така и не успях. Кой да се сети, че може да си ги групираш с LINQ. Много елегантно и просто изглеждат LINQ заявките като ги види човек готови, но не толкова лесно се пишат. Поне на мен нещо ми убягват, когато трябва да се извади нешо по-сложно от колекцията. Така, че тази заявка си я краднах smile 

Бих споделил и някои мои виждания за 3-та задача. Според мен класа Cat би трябвало (или поне би могло) също да е абстрактен и само Kittens  и Tomcats да могат да се инстанцират. На там ме води логиката, когато се казва, че всички котенца задължително са женски, а всички котараци мъжки. В уловието така или иначе нищо не се казва, така че явно си е до лична преценка в случая, няма и значение как ще се направи щом нямаш задание и конкретни цели които да гониш. 

И още нещо. На 2-ра задача Humans, последното сортиране, където преди това merge-ваме. Като стигнах до там и се разрових из stackoverflow, освен че открих и някакъв друг метод за merge с LINQ ( Concat ), който не ми хареса, забелязах и нещо за AddRange, което считам, че е доста полезно. Преди да адваме нови листове е добре да укажем изрично дължината на новия лист в който ги бутаме, предполагам защото листа отдолу като имплементира масив и като му буташ директно нови листове, се удвоява неколкратно повече излишно. Така че със List<Human> humans = new List<Human>(students.Count + workers.Count) и след това AddRange() казват, си връзваме гащите и при по-обемни колекции най-вероятно се вдига пърформънса.

2
02/10/2014 11:39:37
ttitto avatar ttitto 1153 Точки

Благодаря за коментара! 

Не направих Cat абстрактен защото си мисля, че Kitten и Tomcat са умалителни за женско и мъжко коте. Та ако искам да си направя стара котка ( добре че не говорим за клас Dog :) ), тогава какво трябва да използвам. :) Но да знаеш, че си прав.

Това за пърформънса при AddRange не го знаех. Логично е.

0
Yordanoff avatar Yordanoff 17 Точки

Здравей, искам да те попитам на първа задача, защо си въвел детайлите в интерфейс? Не е ли по-правилно да се въведе клас, който да се унаследява от Students, Teachers, Classes и Disciplines?

0
presian avatar presian 223 Точки

Тогава няма да може да наследи People! Поне така го измислих и аз в задачата пише, че студентите и учителите са people. А за детайлите направих интерфейс.

1
02/10/2014 18:49:26
ttitto avatar ttitto 1153 Точки

Сигурно знаеш, че при C# няма възможност един клас да наследява повече от един клас, но може да наследява много интерфейси. Ако Detail е клас, как Student ще наследява едновременно People и Detail?

2
alex687 avatar alex687 20 Точки

Може People  да наследяват Detail. Student и Teacher трябва да имат details , а те са наследници на People .  П.С. по - правилно ще бъде името да не е People ,a да е Person

1
borislavml avatar borislavml 368 Точки

Бая писане падна по това домашно, особенно на CompanyHierarchy , но така и нямаше нещо по интересно освен LINQ заявките.

Очаквах да ни зачукат с нещо, където да ни се наложи да пишем методи с по 5-6 стршн думички отпред (static intrernal protected virtrual примерно smile). Явно идеята е да свикнем просто с концепциите абстракция и наследяване, които на пръв поглед изглеждат доста страшно, но се оказа, че всъщност са нешо доста естествено и близко до естествената човешка логика, и в момента ми се виждат в пъти по-лесни от дженериците и делегатите примерно. Ето един пакет решения и от мен

School-  тук нарочно не съм правил интерфейс IDetails. Незнам защо, от инат да спазя дословно условието може би, а и в случая няма да ми спести никакъв код, нито мога да го ползвам после за тип на някаква колекция приимерно.

Human Student Wokrer  - нищо интересно тук

Animals - отново нищо интересно освен LINQ заявката на края, която ме изтормози

Company Hierarchy -  2 часа копи-пейст, изключително досадно. Много се замислих дали да не махна setter-ите в интерфейсите и да правя пропъртитта на всикчи класове protected set за да са напълно енкапсулирани и да няма достъп до нищо от никъде, но реших да си го спестя и отново да карам по условие. В  готовите интерфейси си имаше сетър, а оствам с впечетление, че логиката е такава и на изпита ше трябва да се съобразяваме с това. Ако няма даден сетър/гетър в интерфейса, тогава задължително preotected/private по класовете надолу.

5
alexxdim94 avatar alexxdim94 33 Точки

Колега, окей ли е да ти използвам теста на трета задача, 'щото нямам повече нерви и време в момента да го пиша, а крайният срок е тази вечер? :D

0
borislavml avatar borislavml 368 Точки

Разбира се. Всичко в GitHub е open-source все пак .smile 

1
presian avatar presian 223 Точки

ttitto в трета задача ако правилно се ориентирам в кода ти на края като изходящи групи със изчилсена средна възръст ще имаш котка , котарак, и женска котка по отделно. Аз си мился, че те трябва да са като една група. Но не намирам начин да ги групирам по-признак ниво в йерархията например и по този начин те да се окажат в парента за котараци. Някой ако има идея как да реша казуса ще се радвам да драсне няколко реда.

1
02/10/2014 23:05:08
RoYaL avatar RoYaL Trainer 6849 Точки

И на мен ми се струва, че така би станало. Няма ли как с implicit casting да се каже на трите котки, че са Cat?

0
presian avatar presian 223 Точки

RoYaL извинявай, можели малко по-подробно, че не разбирам какво имаш предвид.

0
ttitto avatar ttitto 1153 Точки

Като го писах, реших, че ме устройва да си ги смята за всеки вид котки по отделно. Ето така изглежда линку-то ако искаме средна възраст на всички котки:

var groupedAnimals = from animal in animals
                     group animal by (animal is Cat)  ? typeof(Cat) : animal.GetType() into g
                     select new { GroupName = g.Key, AverageAge = g.ToList().Average(an => an.Age) };
1
ttitto avatar ttitto 1153 Точки

Относно export to Dropbox: Ето така изглежда методът ми, който би трябвало да прати избран файл в дроп бокс. Като дебъгвам става ясно че файлът се разчита и влиза в byte масива, но в крайна сметка не се експортира в дропбокс. По всичко което прочетох като документация и примери за DropNet библиотеката, кодът ми би трябвало да сработи. Някой може ли да намери проблема?

private void ExportToDropbox(object sender, RoutedEventArgs e)
       {
           var client = new DropNetClient("flyxzhd2ts40zps", "0w9ucq9pqtambrj");
           client.UserLogin = new UserLogin();
 
           var fileBytes = File.ReadAllBytes(@"../../Reports/Donka-Karamanova-dk-Report.docx");
           var uploadResult = client.UploadFile("../../", "Donka-Karamanova-dk-Report_copy.docx", fileBytes);
       }
0
ZvetanIG avatar ZvetanIG 907 Точки

Качвам и аз  моето домашно

1. School

2 . Human, Student and Worker

3. Animals  - поиграх си малко и направих един статичен метод, който обединява трите котки в един вид "Cat". Този метод го подавам, като параметър на GroupBy. Така ми се стува, че се разбира повече, какво се случва.

4. Company Hierarchy

 

 

6
03/10/2014 13:21:11
RoYaL avatar RoYaL Trainer 6849 Точки

3. Трябва да намериш по-абстрактен начин това да се случва, представи си, че същото важи и за кучетата, това ще интродюсне още един IF и така методът ще се увеличава с времето :)

1
ZvetanIG avatar ZvetanIG 907 Точки

Прав си, направих го така, защото не намерих начин как да извадя типа на родителя.

 

P.S. Оправено е и вече може да работи за различни подвидове животни.

0
03/10/2014 21:02:13
GoShow avatar GoShow 595 Точки

По-добре късно, отколкото никога, за критики, ако някой все още е на вълна this.Domasno :)

1
vvulevv avatar vvulevv 51 Точки

Може ли да ми обясниш само какво прави ключовата дума params ?

0
GoShow avatar GoShow 595 Точки

С нея можеш да въвеждаш, колкото си искаш параметри от съответния масив в конструктора отделени със запетайка.

2
arsoman avatar arsoman 419 Точки

Колеги, искам да попитам, след като VS е платено, аз съм с Express версията, в първата задача се иска клас-диаграма, а моята версия не ги поддържа, какво правим? Всички ли трябва да ползваме нещо от торенти, или има надстройка на Express, която да ползва клас-диаграми? Идеята за три месеца trial на VS много не ми допада, всички ли сте така - на пробен период на професионалната версия или има друг вариант?! Благодаря!

5
Ivaylo.Il avatar Ivaylo.Il 226 Точки

Същия проблем и аз съм на безплатната версия и нямам диаграми. 

0
arsoman avatar arsoman 419 Точки

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

0
petrovaliev95 avatar petrovaliev95 358 Точки

Здравейте, Колеги

Малко късно се включвам, но по добре късно от колкото никога.
Относно задачите - първа е най-смотана, не знам може би заради условието не знам, но на мен не ми допадна. Най-много ми допадна четвърта, там имаше по-дълбоко наследяване и и отделих повече време за да я изпипам.

Ето някои решения на задачите:

 

Ще се радвам ако някой отдели време за да разгледа домашното ми и даде някакъв коментар относно него.

 

Поздрави Даниел

 

3
05/10/2014 00:52:33
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.