[Homework] OOP - Other Types - Септември 2014
Здравейте колеги, нека тук коментираме задачите от домашното за други типове в ООП.
Ето моите решения:
- Galactic GPS
- Fraction Calculator
- Generic List - докато първите две задачи са си straight-forward тук може да има доста различни варианти и ще ми е интересно да видя други решения, както и да получа коментари за моето.
Интересно ми е и за версията дали има начин да се извади директно в променлива, а не да се взима от масива с атрибути.
Поздрави!
Здравей,
всъщност проверките за препълване на типа в пропъртитата на задача 2 не са ли излишни? Препълването става при самото умножение и гърми в checked блока, а иначе ако искаме да подадем на конструктора или на пропъртито стойности, които са извън обхвата на типа няма да ни даде още compiletime. Или бъркам?
@ttitto гледам, че при overload-a на операторите ползваш пропъртитата. Има ли някаква причина? Нали един път вече създадени двете дроби,които събираме са минали проверка от там през сетъра. Или това е по конвенция, оувърлоуда се прави като конструктора, с пропъртита. Стана ми интерсно просто, дали би имало някакво значение при последващо евентуално наследяване на структа, или за пърформънса?
@StanDimitroff: Ако се опиташ да създадеш нов Fraction през конструктора, чрез сума на две променливи за знаменател или числител ще успееш да вкараш препълнен long. Имам предвид нещо подобно: long a = someExpression; long b = someOtherExpression; Fraction fr = new Fraction(a + b, a); Това компилаторът не би трябвало да го хване, но runtime може да се стигне до препълване.
@borislavml: Когато имам свойства, ползвам винаги тях в класа, освен ако не трябва да прескоча умишлено валидацията. Незнам дали е по конвенции така, но със сигурност ми създава комфорт и не мисля всеки път дали трябва да е полето или свойството.
@ttitto, благодаря за разяснението, не се бях сетил, че може да се подаде сбор на две (или повече) променливи като аргументи на конструктора. Пробвах няколо варианта за препълване с твоите проверки обаче не се хващат в пропъртито, а си превърта стойността скрито, защото всъщност value > long.MaxValue означава, че ако имаме 9223372036854775807 + 2 резултатът е -9223372036854775807, което всъщност е по-голямо от long.MinValue и не се хваща от проверката в сетъра, защото е валидно число. Същото важи и за value < long.MinValue. Може би в случая е добре създаването на нов обект да се сложи отново в checked блок, къде могат да се хванат препълванията на long-a. Някой да ме поправи ако греша.
В типизираните методи на GenericList<T> може да не се каства към dynamic ако смениш буквата на типа в метода с някаква различна от Т, защото се припокриват scopes на типа T на метода и типа T на класа.
Понеже видях, че си коментирал, че Min и Max трабва да са generic методи, искам да ти обърна внимание, че и твоите не са такива. Ако беше включил параметъра B в кода на метода, тогава щеше наистина да са generic methods.
ZvetanIG: Да, добър аргумент. Така задачата ще работи по един и същ начин независимо какво се подава на методите Max и Min. Тогава какво искат в задачата като са написали да са generic?!
Не мога само да разбера каква е разликата между това методите Min и Max да са generic и това да не са. Тоест какво по-различно става като добавим <B> към тях?
В случая Цветан е прав, че няма смисъл, защото на тези методи не се подава аргумент, който се използва в тях. Ако примерно бяха статични и се викат през класа (някакъв клас) GenericList<T>.Min<B>(B someCollection) и в тях търсиш минимума в колекцията someCollection (някаква друга колекция) тогава има смисъл, защото колекцията може да е различни типове. Макар че тогава може да се подаде направо интерфейс и пак да минеш без generic
Соред мен единсвения смисъл да са generic би бил, ако методите са static примерно Min<int>(intList) където intList е вече инстанцира нов обект(колекция от integer-и) от класа GenericList<T> и го подавамв на метода да ни върне минималната стйоност в колекцията. Така да го ползваме с точка върху обект intList.Min<int>() ми се вижда пълна безмислица. Голям дебат стана по тази точка от домашното, ше е добре някой от писалите го да вмъкне яснота. Или някой от присъствените, който е задал въпроса на упражнение.
Колеги, може ли малко помощ,
на Galactic GPS в първа задача всички, които видях наследяват празен конструктор.
Има ли начин да се получи без това наследяване, защото се мъчих и ми дава грешки ако го няма, но така може да създам и празен Location a аз не искам да е възможно.
@b.grigorov: Няма начин да оставиш структура без празния и конструктор.
Поздравления за задачите. Не знам как си се оправил с Word Document Generator. Никъде не намерих читава инфорамция как се работи. Освен да препиша от теб, друго не измислих. Но как ресайзваш картинката? Излиза ми огромна.
Още един пакет след двудневна борба! ЦЪК