Homework - Принципи на ООП - част I


4

Здравейте, днес и утре са лекциите за Принципите на ООП (част 1) и съответно за домашното по темата.

Ето ги моите решения.

Задачите са интересни и дават бегла представа какво ни очаква на изпита. :)


в C# OOP от baretata (934 точки)


Отговори



0

Имам проблеми със Sex-a в 3-та задача.

Опитвам се да направя валидация:

 private char sex;

        public char Sex
        {
            get
            {
                return this.sex;
            }
            private set
            {
                if (sex != (char)12)
                {
                    throw new ArgumentException("Kittens can't be male!");
                }
                this.Sex = (char)12;                 // Този символ връща знака за женски пол, Венера, както ви хареса
            }
        }

Искам да е по-ефектно на конзолата, но проблемът е, че не работи. В конструктора пиша new Kittens(1, "kitty", (char)51)    // 51 е 3 в случая. Трябва да гърми, но не го прави! Подозирам, че не харесва cast-a, но не знам как да го направя другояче.


от Bruno (921 точки)


0

Ето класовете, като второто е комбинирано, да не правя 3-ти файл:

Kittens

Cats_and_Animals


от Bruno (921 точки)

1

Не минаваш през пропъртито, това е причината. Никъде не извикваш Sex от Kittens. В момента създаваш Kittens, със sex = (char)51, което през конструктора на Kittens го предаваш към този на базовия клас Cats, а той по същия начин го предава на базовия си Animals, където се приема от this.Sex (в Animals) който не прави никаква проверка.

Нещо ти изгубих смисъла на тази проверка в Kittens, но ти си знаеш... по принцип това което се иска е да укажеш директно в конструктора на Kittens че е от женски пол, по-нагоре ще видиш че едни колеги го правят с enum Sex.Female, други с bool isMale = false, ти си решил с char, което е без значение, но при всички случаи проверките са излишни, понеже не е нужно Kittens да приема sex въобще, т.е. в твоя случай ще е нещо такова:

        public Kittens(int age, string name)
            : base(age, name, (char)12) { }

Освен това сега виждам, че имаш и още една грешка, this.Sex = (char)12; трябва да е this.sex = (char)12; в противен случай ще зациклиш в пропъртито и ще получиш StackOverflowException.

И си преименувай всички класове да бъдат в ед. ч. - това не са колекции.


от Flystar (1171 точки)



0

Ето и моето решение.

Тъй като в първа и втора задача имаме сходни класове - Student, Teacher и Worker, а в трета задача пък е  Animal - общо взето, тези три класа могат да произхождат от общ абстрактен клас (например Human за Student, Teacher и Worker) и затова ги отделих в библиотека и в отделен проект CreatureClassLib (към него може да се добави на най-високо ниво клас Creature, който да се наследява от Human, Animal и т.н., като изпълнява интерфейси от рода на IMoveable, IExist - нещо от сорта). Добавих референции и програмите работят.

Но когато направих клас-диаграмата по първа задача, ми се получават отделни "кутийки" за класовете и интерфейса, със стрелки в класовете-наследници към родителя Human. Самият клас Human липсва и мога да го покажа само в отделна клас-диаграма. Липсва името на интерфейса и връзките към него - не мога да разбера дали греша при получаването на диаграмата, или така работи при използване на библиотеки? Може ли някой да ми обясни?


от ellapt (6303 точки)