Loading...
Tr00peR avatar Tr00peR 566 Точки

[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 1153 Точки

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

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 1153 Точки

@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 907 Точки

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

1
ttitto avatar ttitto 1153 Точки

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

0
Velichkov avatar Velichkov 87 Точки

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

0
ttitto avatar ttitto 1153 Точки

В случая Цветан е прав, че няма смисъл, защото на тези методи не се подава аргумент, който се използва в тях. Ако примерно бяха статични и се викат през класа (някакъв клас) 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 1153 Точки

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

1
Hristo_Penchev avatar Hristo_Penchev 389 Точки

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

0
borislavml avatar borislavml 368 Точки

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

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