[Homework] OOP - Defining Classes - Ноември 2015
Здравейте, нека споделяме решенията от домашното за първата лекция по ООП, в тази тема,
Предполагам за всички ще бъде удобно да има тема в която да споделяме и задаваме въпроси.
Ето и моето домашно
Здравейте, нека споделяме решенията от домашното за първата лекция по ООП, в тази тема,
Предполагам за всички ще бъде удобно да има тема в която да споделяме и задаваме въпроси.
Ето и моето домашно
Ето го и моето домашно.Добавил съм регекс,за валидация на емейла.Също така,мисля,че е по-добре exceptions да са от по-информативен тип.
https://github.com/slavpetroff/OOP---Homeworks/blob/master/Problem1_Person.cs
Здравейте,
давам линк към решени задача 1 и 3, като трета я реших.. току що, а в 4:30 сутринта не се пише добър код - всички предложения как да бъде подобрена са добре дошли!
Единственото, което се различава от вашите решения е, че съм използвал MailAddress класа за проверка на валидността на имейл адреса. Струва ми се доста приятен начин да се измъкнеш от регулярните изрази, със задоволителна точност, а и Microsoft го предлагат в MSDN - How to: Verify that Strings Are in Valid Email Format.
Здравей,
Една идея за 3та - с params можеш да подадеш колкото искаш аргументи(компоненти), не е нужно да подаваш лист:
public Computer(string name, params Component[] component)
{
this.Name = name;
foreach (var item in component)
{
this.components.Add(item);
this.Price += item.Price;
}
}
По този начин можеш да създадеш обектите с Computer PC1 = new Computer("PC1", ram1, hdd1, gpu1, cpu1);
Адски полезно. Благодаря. Аз лично, не можах да се сетя за по-добър начин за решаване на 3-тата задача.
А какво правим ако искаме след време да добавим още един компонент... :Д
Ето 4те задачи и от мен:
Привет!
Относно 4-та задача :
LINQ израза ти хваща наследниците на CurrentStudent (Onsite/OnlineStudent).
Това е понеже ofType<> хваща и наследниците... :(
Затова трябва проверка като например :
if (Object.GetType() == typeof(CurrentStudent))
Не съм разгадал още как да го направя през LINQ израз (най-вероятно с where).
#Edit - разгадах :
classTests
.OfType<CurrentStudent>()
.Where(o => o.GetType() == typeof(CurrentStudent))
.OrderByDescending(student => student.AverageGrade)
.ToList()
.ForEach(Console.WriteLine);
Поздрави,
Владо
Ами точно така трябва да бъде, защото както виждаш класа CurrentStudent е абстрактен и неможе да се инстанцира. (public abstract class CurrentStudent : Student)
("Extract only the Current Students, sort them by average grade and print information about each one on the console.")
На диаграмата в условието не са показани абстрактни класовете, по простата причина , че все още не е преподавано, но вярвам че всеки ще се съгласи че Person, Student, CurrentStudent трябва да бъдат абстрактни :)
Тоест, ако linq-a не ми хваща наследниците, то тогава няма да работи.
Поздрави
Проверката дали даден обект е от тип CurrentStudent може да се прави и с is:
persons.Where(person => person is CurrentStudent)
Edit: За abstract си прав, писах мнението си по спомен, но след това отворих домашното и видях, че CurrentStudent може да е Online и Onsite.
Здравейте колеги, ето какво видях аз:
@bgnightwish
Като препоръка, мога кажа, че не са подредени много правилно елементите в класа ти.
Ето дискусия по темата в stackoverflow, както и StyleCop документацията:
http://stackoverflow.com/questions/150479/order-of-items-in-classes-fields-properties-constructors-methods
@slavpetroff
Липсва ти втория конструктор с който се прави обект без мейл. Не че както си го направил няма да работи, просто идеята е да се тренира преизползването на конструкторите.
@rextor92
В Persons няма да е лошо да изнсеш класа тест в собствен файл.
А относно валидирането на имейла, тук според мен по - важно е да се тренира енкапсулацията, а не да се конкретизира как.
В смисъл и !value.Contains("@") отговаря на условието.
Малко оффтопик, но искам да попитам днес продължава ли се с лекциите по ООП? Понеже, когато се записвах за група пишеше веднъж седмично в понеделник, а в графика на залите има 3пъти седмично.
Да, продължава се - ООП е понеделник, сряда и петък. В страницата на курса има един файл "Програма на курса".
Здравей,bgnightwish
Мисля, че в твоето домашно има малка грешка. В условието е написано: "Define a property for the email that accepts either null or non-empty string containing '@'. Това не значи ли, че може да съдържа null, но не и празен стринг (""). Според мен трябва да е:
if(value == "" || !value.Contains("@"))
{
throw new ArgumentException("Invalid email!");
}
else
{
this.email = value;
}
alevtodorov : Аз го бях направил точно както ти си предложил :) Само, че когато създадох инстанция на Person без да давам имейл ми хвърли Exception :) Понеже, като не подавам имейл, имейла е null.
И тук:
if(value == "" || !value.Contains("@"))
Първо проверява дали null == "", което връща false, и понеже връща false се налага да провери и дясната част на ИЛИ-то. Тръгва да вика метода Contains() за value, който в този случай е null.. И хвърля NullReferenceException.
И го направих така:
(Важно е първо да проверяваш за null, а после проверката с Contains(), защото иначе ако не подадем имейл value пак ще е null, и пак ще хвърли NullReferenceException. А в случая, ако value==null, то първият аргумент на ИЛИ-то вече е TRUE, и вече вторият аргумент не го изчислява(съответно няма да има NullReferenceException), защото при ИЛИ е достатъчно единият аргумент да е TRUE, за да е цялото TRUE)
if (value == null || value.Contains("@"))
{
email = value;
}
else
{
throw new ArgumentException("Email must be Non-Empty and be a valid email address.");
}
Да. Прав си. Така е по-правилно. Съгласен съм.
Здравейте, аз чак днес имам възможност да седна и да се пробвам върху задачките, но от тази сутрин направих само първата:
http://pastebin.com/raXb709a
Ето го кодът ми, приемам забележки. :)
Искам да попитам може ли някой да ми помогне с разясняването на това override ToString() метода, защо го правим, че малко ми е объркано и не мога да го схвана.
Лек ден!
Всеки обект има ToString() метод, който връща стринг-а репрезентиращ обекта. Default-ния ToString() връща името/типа на обекта (примерно Console.Write(myArray) ще ти каже че е масив и от какъв тип е). Когато го override-неш, ти променяш какво прави този метод когато е приложен върху обекти от твоя клас - така когато направиш Console.Write(myObject), вместо да ти изпише в конзолата името/типа на обекта, ще изпише точно това което искаш (примерно някое поле - name, age, каквото искаш).
Както съм писал вече по - горе, трябва всеки клас да бъде в отделен файл. :)
edit: да, прав си - съгласявам се с теб :) Не те бях разбрала правилно.
Здеавйте!
Някой може ли да каже дали така е добре написан кода ми. http://pastebin.com/x2eDZt9C
Според мен си е добре.
Ето и моято решение: https://github.com/T316/OOP/tree/master/01.%20DefiningClasses
Здравейте,
ето и моята задача 1,
http://pastebin.com/7YN6Kb6m
компилира се нормално но на финала в конзолата принтира:
ProgramPersonHW.Person
ProgramPersonHW.Person
Някой може ли да ми даде насоки, какво да търся... опитах с дебъгера но не виждам нищо което може да е причина?
Това е защото методите, незнаят как да се отпечатват.
Когато се извика Console.WriteLine(), параметъра който му се подава му се вика .ToString() метода, затова, за да може да ти се отпечатват обектите трябва да им напишеш override на .ToString(), който трябва да върне string, форматиран така както искаш да бъде принтирано.
виж малко по-горе Gabbs е обяснила за ToString() метода. Та .... - изписва ти това е конзолата защото вкласа Person си не си го overridе-нал метода.
Можеш да го направиш например така:
public override string ToString() | |
{ | |
return string.Format("Name: {0}, Age: {1}", name, age); | |
} |
като добавиш и за мейла подходящ код разбира се ..
Ако искаш хората винаги да се принтират по един и същи начин - override ToString(). Ако еднократно искаш да изведеш информация - просто достъпвай отделните пропъртита, които ти трябват, например: Console.WriteLine("{0} {1), age: {2}", person.FirstName, person.LastName, person.Age). Въпрос на преценка е кое е за предпочитане.
Регекса е супер!
Само се чудя дали не трябва, когато след точката има повече от 3 букви, например .commm, не е ли по-правилно да изпусне целият match, вместо да хваща редо до 3тата буква ?
И аз не съм сигурен, само питам :)
Също хваща и нещо от типа на Ivan@abv. т.е. без .бг и т.н.
Здравей, може ли да оправиш file extension-a на .cs защото без оцветяване на кода е много грозно за четене :( А ми е интересно да разгледам, но с тоя черен цвят въобще не ми се гледа..
Редактирал съм го.