[OOP] Common Type System - Задача 4


9

Условие:  

Create a class Person with two fields – name and age. Age can be left unspecified (may contain null value. Override ToString() to display the information of a person and if age is not specified – to say so. Write a program to test this functionality.
 
Моята логика е: (сигурно има и по-елегантно решение):
В класа Person пропъртито Age е nullable тип, за да може да съдържа null.
Имам два конструктора - единият приема само името, и се обръща към втория със стойност null за възрастта. Вторият съответно изисква да се попълнят и името, и възрастта.
Във втория конструктор правя и съответните проверки за това възрастта да е число между 0 и 124, а името да не е null, и да е повече от eдин символ.
 
При override на ToString имах проблем - не се компилираше по-долната част от кода, докато не направих всички части на израза (по правилно е да го нарека тернарен оператор) са от един и същи тип - стринг в случая.

(this.Age.ToString()!="")?this.Age.ToString():"Not Specified")

 
Правя тест с един човек с известни име и възраст, и един на който само името е известно.
 
Ето линк към GitHub, където може да прегледате кода.
 
Поздрави



Отговори



2

Можеш да си спестиш писането на 2 конструктора, като в дефиницията сложиш след age - = null. Това позволява, когато се инстанцира класът полето да не е задължително и по default остава null.

Останалото при мен е абсолютно същото, но тестовете съм ги изнесъл в Test project.

Решение - _клик

Тест - _клик


от georgi.ivanov (3261 точки)


0
Благодаря за предложението. Поздрави,



2

Може да проверяваш дали age е null и без ToString(), по този начин:

this.Age!=null? this.Age.ToString() : "Not Specified"

Иначе моето решение е сходно.




4

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

Решение.


от tankovski (2828 точки)


2

Моето решение с коментари в GitHub..
За да се изпълни условието на задачата е нужен само един конструктор.


от zhelyazkovn (2949 точки)


0
А защо не оставиш името да се сетва от друг клас или от потребителя, защо трябва да го правиш предварително дефинирано :) :
this.Name = "Svetlin Nakov";

от atodorova (1273 точки)

0
:) Здравей, направил съм го така, защото това ми е нещо като default constructor...т.е. ако не се подадът параметри всеки да се казва Светлин по подразбиране...Идеята ми беше да тествам набързо дали работи...Правилното тук е да се направи и още един конструктор който да приема параметри, и така ще може името да се сетва...(в бързината си не съм го създал)... т.е. да имаме два конструктура - един дефоултен и един с параметри :) Поздрави! :)

от zhelyazkovn (2949 точки)


4

Ето моя подход към задачката. Използвала съм два конструктура, въпреки че сега като се замисля наистина това със int? age = null е хитро.

В случая оабче не мисля че е някакъв проблем да се ползват два конструктора:

Решение


от atodorova (1273 точки)


0
Браво, твоето решение е по-правилно от моето, по-пълно :) +1

от zhelyazkovn (2949 точки)

0
Това с int? age = null е хитро, но не е много добра практика. По-добре е да си имаш 2 конструктора, като единия вика другия със стоуност null.

от PBorukova (1129 точки)


1

 

Някой може ли да ми помогне, защо това не работи?
   
public override string ToString()
    {
        return string.Format("{0} {1}", this.Name, this.Age.ToString() ?? "uknown");
    }

от IceElementor (398 точки)


0
Значи Age-a трябав да го направиш с тринарният оператор (условие) ? какво да изпълни при true : какво при false... примерно така
(this.Age.ToString() != "") ? this.Age.ToString() : "Not Specified")
ако нямаш празен age ? вярно=this.Age.ToString() : грешно "Not Specified"



0

GitHub

Цялата магия е в този ред :
return string.Format("Name: [{0}] , Age [{1}]", this.Name, this.Age == null ? "Unknown" : Age.ToString())

от dzhenko (3893 точки)


0
https://github.com/geniusvil/04.Person
В override на ТоСтринг() използвам различни подходи за принтиране на property аge - веднъж приемам, че е string , а веднъж , че е int?. Приемам , че входните данни са валидни, затова не ги валидирам (приемам го за мой пропуск)

от geniusvil (192 точки)


1
Задачата е доста елементарна. Трябва да дефинираме възрастта като int?, за да може да е null и в ToString() правим проста проверка, дали имаме възраст.
http://pastebin.com/c1BNaPMy



0

Аз ToString() го направих така:

return string.Format("My name is {0} and my age is {1}.", this.name,
 string.IsNullOrEmpty(this.age.ToString()) ? "unspecified" : this.age.ToString());

от dimo.petrof (2887 точки)