Професионална програма
Loading...
Tr00peR avatar Tr00peR 569 Точки

[Homework] OOP - Other Types - Септември 2014

Здравейте колеги, нека тук коментираме задачите от домашното за други типове в ООП.

Ето моите решения:

  1. Galactic GPS
  2. Fraction Calculator
  3. Generic List - докато първите две задачи са си straight-forward тук може да има доста различни варианти и ще ми е интересно да видя други решения, както и да получа коментари за моето.

Интересно ми е и за версията дали има начин да се извади директно в променлива, а не да се взима от масива с атрибути. 

Поздрави!

14
C# OOP Basics 26/09/2014 23:42:27
ttitto avatar ttitto 1154 Точки

Ето го и моят комплект. Старал съм се да спазвам правилата за форматиране от първия урок по КПК.

GalacticGPS

FractionCalculator

GenericList<T> + Version - не можах да избегна dynamic при двата generic метода Min<T> и Max<T>, въпреки че пробвах да кастна изхода към типа на T с reflection. Създадох си един клас Student за тестовете, защото исках да видя как ще реагира референтен тип на многобройните копирания на вътрешния масив.

ЕДИТ: Добавена задача!

WordDocumentGenerator - Единствено не успях да направя списъкът с точките да бъде навътре. Знам как се променя поредността на ListItem в йерархията на списъка, но тогава се променя и булетът пред него.

3
25/09/2014 21:10:17
StanDimitroff avatar StanDimitroff 90 Точки

Здравей,

всъщност проверките за препълване на типа в пропъртитата на задача 2 не са ли излишни? Препълването става при самото умножение и гърми в checked блока, а иначе ако искаме да подадем на конструктора или на пропъртито стойности, които са извън обхвата на типа няма да ни даде още compiletime. Или бъркам?

0
borislavml avatar borislavml 368 Точки

 @ttitto гледам, че при overload-a на операторите ползваш пропъртитата. Има ли някаква причина? Нали един път вече създадени двете дроби,които събираме са минали проверка от там през сетъра. Или това е по конвенция, оувърлоуда се прави като конструктора, с пропъртита. Стана ми интерсно просто, дали би имало някакво значение при последващо евентуално наследяване на структа, или за пърформънса? smile

0
ttitto avatar ttitto 1154 Точки

@StanDimitroff: Ако се опиташ да създадеш нов Fraction през конструктора, чрез сума на две променливи за знаменател или числител ще успееш да вкараш препълнен long. Имам предвид нещо подобно: long a = someExpression; long b = someOtherExpression; Fraction fr = new Fraction(a + b, a); Това компилаторът не би трябвало да го хване, но runtime може да се стигне до препълване.

@borislavml: Когато имам свойства, ползвам винаги тях в класа, освен ако не трябва да прескоча умишлено валидацията. Незнам дали е по конвенции така, но със сигурност ми създава комфорт и не мисля всеки път дали трябва да е полето или свойството.

1
StanDimitroff avatar StanDimitroff 90 Точки

@ttitto, благодаря за разяснението, не се бях сетил, че може да се подаде сбор на две (или повече) променливи като аргументи на конструктора. Пробвах няколо варианта за препълване с твоите проверки обаче не се хващат в пропъртито, а си превърта стойността скрито, защото всъщност value > long.MaxValue означава, че ако имаме 9223372036854775807 + 2 резултатът е -9223372036854775807, което всъщност е по-голямо от long.MinValue и не се хваща от проверката в сетъра, защото е валидно число. Същото важи и за value < long.MinValue. Може би в случая е добре създаването на нов обект да се сложи отново в checked блок, къде могат да се хванат препълванията на long-a. Някой да ме поправи ако греша.

1
StanDimitroff avatar StanDimitroff 90 Точки

В типизираните методи на GenericList<T> може да не се каства към dynamic ако смениш буквата на типа в метода с някаква различна от Т, защото се припокриват scopes на типа T на метода и типа T на класа.

0
ZvetanIG avatar ZvetanIG 917 Точки

Понеже видях, че си коментирал, че Min и Max трабва да са generic методи, искам да ти обърна внимание, че и твоите не са такива. Ако беше включил параметъра B в кода на метода, тогава щеше наистина да са generic methods.

1
ttitto avatar ttitto 1154 Точки

ZvetanIG: Да, добър аргумент. Така задачата ще работи по един и същ начин независимо какво се подава на методите Max и Min. Тогава какво искат в задачата като са написали да са generic?!

0
Velichkov avatar Velichkov 87 Точки

Не мога само да разбера каква е разликата между това методите Min и Max да са generic и това да не са. Тоест какво по-различно става като добавим <B> към тях?

0
ttitto avatar ttitto 1154 Точки

В случая Цветан е прав, че няма смисъл, защото на тези методи не се подава аргумент, който се използва в тях. Ако примерно бяха статични и се викат през класа (някакъв клас) GenericList<T>.Min<B>(B someCollection) и в тях търсиш минимума в колекцията someCollection (някаква друга колекция) тогава има смисъл, защото колекцията може да е различни типове. Макар че тогава може да се подаде направо интерфейс и пак да минеш без generic

1
26/09/2014 11:22:33
borislavml avatar borislavml 368 Точки

Соред мен единсвения смисъл да са generic би бил, ако методите са static примерно Min<int>(intList) където intList е вече инстанцира нов обект(колекция от integer-и) от класа GenericList<T> и го подавамв на метода да ни върне минималната стйоност в колекцията. Така да го ползваме с точка върху обект intList.Min<int>() ми се вижда пълна безмислица. Голям дебат стана по тази точка от домашното, ше е добре някой от писалите го да вмъкне яснота. Или някой от присъствените, който е задал въпроса на упражнение. smile

1
b.grigorov avatar b.grigorov 7 Точки

Колеги, може ли малко помощ,

на Galactic GPS в първа задача всички, които видях наследяват празен конструктор. 

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

0
ttitto avatar ttitto 1154 Точки

@b.grigorov: Няма начин да оставиш структура без празния и конструктор. 

1
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Поздравления за задачите. Не знам как си се оправил с Word Document Generator. Никъде не намерих читава инфорамция как се работи. Освен да препиша от теб, друго не измислих. Но как ресайзваш картинката? Излиза ми огромна.

0
borislavml avatar borislavml 368 Точки

Още един пакет след двудневна борба! ЦЪК

0