Loading...
malkstor avatar malkstor 348 Точки

[Homework] [OOP June 2015] Other Types in OOP

Здравейте колеги :)

Интересно ми е някой направи ли вече 4-та задача, че нещо ме тормози.

Това е до където съм я докарал - от ред 150 надолу.

Така написана, компилатора ми дава грешка, че не може да кастне към Version във foreach-а, а при дебъгването в масива от обекти се получават разни странни неща. Когато сложа общо-взето същото в Main метода и сменя само това:

Type type = typeof(Program);
и сложа преди самия клас [Version(0, 2)] всичко работи ок, но идеята е да се вгради в самия GenericList клас, а не в този с Main метода, който в моя случай се казва Program.

Тагове:
4
C# OOP Basics 15/06/2015 20:33:47
Filkolev avatar Filkolev 4482 Точки

Името на атрибутите е прието да завършва с Attribute, т.е. VersionAttribute.

Хубаво е да сложиш и валидации, понеже отрицателна версия не е логично да има.

Кастването не може да стане във форийча, понеже компилаторът не знае какви са типовете на атрибутите, които са сложени за класа. Ползвай object за целта. Може да правиш проверки с is или кастване с as в самия форийч, или по-лесното - да овъррайднеш ToString на самия атрибут и при принтиране да излезе смислено инфо.

0
malkstor avatar malkstor 348 Точки

Прав си за името и валидациите, оправих ги, но те не влияят на проблема. Кастването така, както е написано, го взех от презентацията по темата и когато го правя в Main метода си работи нормално. Поради някаква причина масива от обекти съдържа точно каквото трябва, ако е в Main метода, a в класа GenericList съдържа един куп глупости, нямащи нищо общо с версията от атрибута. Ако сложа кастване към обект във foreach-а не мога да достъпя стойностите на Major & Minor version. Всъщност към каквото и да ги каствам елементите на масива, не мисля че ще проработи, понеже той не съдържа правилните данни. 

Подозирам че този ред предизвиква проблема:

Type type = typeof(GenericList<T>);

но нямам идея защо.

0
Filkolev avatar Filkolev 4482 Точки

Пуснах програмата. Всъщност ти получаваш правилното инфо, но така направено се появява някакъв DefaultMemberAttribute, който създава проблемите. Във форийча ако направиш проверка дали текущия атрибут е Version ще стане.

0
Filkolev avatar Filkolev 4482 Точки
public void ShowVersion()
{
    Type type = typeof(GenericList&amp;lt;&amp;gt;);
    object[] allAttributes = type.GetCustomAttributes(false);
    foreach (object ver in allAttributes)
    {
        Version v = ver as Version;
        if (v != null)
        {
            Console.WriteLine("&gt;&gt;&gt; GenericList v.{0}.{1} &lt;&lt;&lt;\n", v.Major, v.Minor);
        }
    }
}

Работи, ето как изглежда методът с проверката.

0
14/06/2015 19:49:13
pataroka avatar pataroka 319 Точки

Асене, здравей! До четвърта не съм стигнал още, но си позволих да ти прегледам втора, и ми се струва, че там имаш някой пропуски...

При овърлоудването на операторите - гарантирано ще превъртиш лонга с тия директни умножения без да минаваш през BigInteger.

Проверките в сетърите на пропъртитата са безмислени, ако си ги задал да са от тип long и респективно параметрите на конструктора да са от тип long, щот ако се опиташ да въведеш по-голямо/по-малко число компилатора ще ревне че си извън границите на long-a още преди да стигнеш до тия проверки.

Аз го направих така - 02.FractionCalculator. Ся може и да кривя малко от условието, щот опростявам дробите, а и проверките ми са извън пропъртитата, ама ако някой има по-добра идея да казва.

П.П. Между другото, ако искаш можеш да смениш заглавието на темата за цялото домашно - няма друга отворена тема освен тази.

1
15/06/2015 16:48:43
malkstor avatar malkstor 348 Точки

Здравей Пламене,

Прав си, благодаря за забележката! Въобще не се замислих, че ще получавам евентуално по-големи стойности когато смятам общия знаменател и т.н. Ще си коригирам решението да ползва BigInteger.

В началото помислих, че говориш за overload-ването на оператора +, и се зачудих как може да се оправи това, щото типа, който се връща трябва винаги да е от същия тип като аргументите, но после се усетих, че и native типовете си преливат по default и видях че имаш друго предвид.

Сега ще сменя и заглавието на темата.

0
15/06/2015 20:34:46
indieza avatar indieza 46 Точки

Малко не мога да схвана това което правиш (ако можеш ми го обясни набързо) пък и във условието не пише ли:

"Override ToString() to print the fraction in floating-point format."smiley

0
malkstor avatar malkstor 348 Точки

Здравей колега, ами идеята на класа Fraction е, че работи с дроби с отделни числител и знаменател. Override.ToString с плаваща запетая значи просто да разделиш числителя на знаменателя, а след това отпечатваш полученото число като реално с плаваща запетая.

0
pataroka avatar pataroka 319 Точки

Ето ги всичките ми решения на това домашно. 06.Other-Types-in-OOP-Homework.

На пета задача, решението ми е доста дърварско - нямам проверки при четенето на файловете и прочее, ама тая DocX библиотека ми изяде главата. Особено частта с bulleted листа, както е видно. Има метод за добавяне на параграф в лист, ама като добавя параграф - не излизат булетите. Има метод за добавяне на стринг в листа, ама като добавяш стринг - не можеш да го форматираш. Абе според мен тая библиотека все още е далеч от кадърно направена. ...И другото хипер дразнещо нещо - няма документация, линкът към сорс кода е резнат - подръжката е през блога на един от авторите и той пуска на парче по някое ново обяснение кое как работи и как се прави. Абе трагедия - ще чакаме Майкрософт най-накрая да си оправят OpenXML, че да работи без да иска инсталиран Офис.

1
malkstor avatar malkstor 348 Точки

И моето е доста дърварско, а и доколкото разбрах след консултация с Фил преди лекцията вчера - толкова customized за определен документ няма как да не е с един куп hardcoded действия.

Все пак, булетите не са особено сложни, след момента в който се усетиш (на мен ми отне известно време :)), че трябва да си направиш отделен списък с редовете, които искаш да са с булети и зададеш съответния параметър:

// Insert bulleted lines
            var bulletedList = doc.AddList(textLines[4], 0, ListItemType.Bulleted);
            doc.AddListItem(bulletedList, textLines[5]);
            doc.AddListItem(bulletedList, textLines[6]);
            doc.InsertList(bulletedList);

 

1
16/06/2015 15:12:44
pataroka avatar pataroka 319 Точки

Тъй де... Ама не виждам и ти да си открил начин за форматиране на текста в листа. Има метод Add(Paragraph) към List класа, ако искаш го пробвай да видиш какво нищо и половина ще излезе. Съответно Paragraph класа има пропърти bool isListItem, което обаче не може да се сетва ръчно, естествено - аз го ползвах да видя кво точно става. Оказа се, че параграфите ми се добавят в листа, обаче това пропърти не се променя и вероятно това играе някаква роля при нищото дето се получава. Гледах, правих, струвах - не става без сорс код и/или документация тая работа и накрая му теглих една дълга и качествена...

1
16/06/2015 17:05:42
malkstor avatar malkstor 348 Точки

Става ама е зор и отнема време, а има и по-важни неща за правене. Аз го докарах до този вид документа и реших, че делегатите и евентите са по-важни.

0
16/06/2015 18:48:52
KatyaMarincheva avatar KatyaMarincheva 572 Точки

И от мен със закъснение част от задачите, с които си поиграх допълнително:

Problem 1. Galactic GPS, с допълнителен метод public double GetDistance(Location other), използва system.device.dll

Problem 2. Fraction Calculator, с допълнителни методи:

public static Fraction operator *(Fraction fraction1, Fraction fraction2)

public static Fraction operator /(Fraction fraction1, Fraction fraction2)

public string SimpleFractionToString()

и ClassFractionTests.cs file с Unit Tests за properties и methods

Problem 3 and 4. Generic List and Version, с методи:

Count

Capacity

public T this[int index]

public static K Min<K>(GenericList<K> list) where K : IComparable

public static K Max<K>(GenericList<K> list) where K : IComparable

public void Add(T elementToAdd)

public void RemoveAt(int index)

public void Remove(T elementToRemove)

public void InsertAt(int index, T newElement)

public int IndexOf(T elementToFind)

public int LastIndexOf(T elementToFind)

public bool Contains(T elementToCheck)

public void Clear() // дава празен GenericList: Count = 0, със запазено изходно Capacity=16.

и с пълна XML документация, одобрена от StyleCop - поориентиерах се какво иска StyleCop като документация, но отнема доста време, въпреки че използвах GhostDoc for Visual Studio 2013.

 

 

2
22/06/2015 12:57:15
pataroka avatar pataroka 319 Точки

Ти поне закъсняваш с постване във форума, а аз ги постнах във форума, а пък забравих да ги кача в сайта :(

0
KatyaMarincheva avatar KatyaMarincheva 572 Точки

@pataroka,

ти ми се издигна в очите :)

Когато аз се ядосвах за подобни неща, RoYal ми каза, че нищо от това няма значение, защото самата среда в СофтУни е добронамерена. И после се убедих сама, че е така.

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

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