Loading...
Hristo_Penchev avatar Hristo_Penchev 389 Точки

[Homework] OOP - Defining Classes - Problem {4} - Software University Learning System - съхранение на инстанция в тип object и извикване на метод

Боря се с четвърта задача. Създадох структурата от класове. Проблемът идва другаде:

http://pastebin.com/TS6ZcDQn - това е написаният до момента код.

В началото на цикъла потребителят си избира какъв обект да създаде - Trainer, OnlineStudent и т.н. Но понеже не знаем точно какво ще избере потребителят, съхраняваме създадения от него клас в object temp. На ред 85 проверяваме дали създаденият обект е Trainer и ако е такъв - даваме възможност на потребителя да тества CreateCourse() метода. Но на ред 93 ми изписва, че променливи от типа object нямат метод  CreateCourse(). Тоест явно след като запазим класа като object кодът вече не разпознава точно какъв клас е. Интересното обаче е, че ToString() работи, не знам защо. Та, въпросът ми е, как да накарам object temp да разбере, че е Trainer и да използва метода CreateCourse()? Може да стане с някакъв много заобиколен начин с 10 променливи за всеки тип и много условни конструкции, но сигурно има и по-умен вариант. Благодаря предварително!

-2
C# OOP Basics
AleksandurSeferinkin avatar AleksandurSeferinkin 333 Точки

Дъщерен клас знае кой клас наследява, но обратното е нелогично.

Всеки клас, който наследява друг, може да бъде разглеждан като обект от инстанция на класа, който наследява - без кастване. Това е идеята на 'polymorphism'! Също така в c# всеки обект пази информация за себе си. Винаги можеш да разбереш какъв е крайния тип на даден обект като извикаш метода 'GetType()'.

Друг начин да провериш дали даден обект е инстанция на даден тип е да ползваш оператора 'is' :

student.GetType() == typeof(DropoutStudent) или if (student is DropoutStudent)

След като разбереш, че обект е от 'този' тип, трябва да го кастнеш към такъв, за да го ползваш като такъв. По тази причина съществува кастване с резервираната дума 'as' (пример: this.student as Person), което връща 'null', ако кастването е невъзможно.

Като цяло това е идеята на 'абстракцията'. Няма как да гледаш на човек като на ученик, но можеш да гледаш на ученик като на човек. Въпроса е като на какъв тип гледаш обекта в момента и от какъв тип е обекта по принцип.

Ключовият момент в тази задача е да провериш дали даден обект е от даден тип или наследник на даден тип, да го кастнеш към такъв и да го ползваш като такъв.

ПС: Тук можеш да видиш моето решение. Аз съм ползвал метода 'IsSubClassOf' на типа 'Type', за да разбера дали даден обект е от 'еди-кой-си' тип, или е дъщерен на 'еди-кой-си' тип.

ПС: Примери за проверяване на типовете на обектите.

ПС: ToString() работи за всички обекти, защото всички обекти/класове наследяват класа 'Object', дори да не искаш, дори и да не знаеш... Дъщерен клас може да извиква методи на базов клас, но обратното е нелогично. - кастването му е майката.

3
20/01/2015 06:19:53
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.