Професионална програма
Loading...
+ Нов въпрос
butoff avatar butoff 33 Точки

Наследяващ клас: Къде и кога се прави инициализация на пропъртита? (Minedraft)

Пример от лектор на Microsoft: 

// TechnicalEmployee Class inheriting from Employee Class
    class TechnicalEmployee : Employee
    {  
        // Calls upon base-class (Employee Class) constructor from within derived class (TechnicalEmployee Class)
        // Sets baseSalary to 75000 for all TechnicalEmployee objects
        public TechnicalEmployee(String name) : base(name, 75000)
        { }
    }

Пример: Minedraft C# OOP Basics Exam - 16 July 2017

Условие на задачата.

For all harvesters you need to validate, that ore output and energy requirement for each harvester is NOT negative.
Also you need to validate that energy requirement for each harveter is NOT over 20000. 

UPON INITIALIZATION, divides its given energyRequirement by its sonicFactor.

Конструктор на колега:

public SonicHarvester(string id, double oreOutput, double energyRequierment, int sonicFactor) 
        : base(id, oreOutput, energyRequierment)
    {
        this.SonicFactor = sonicFactor;
        this.EnergyRequirement /= this.SonicFactor;
    }

Моят конструктор:

public SonicHarvester(string id, double oreOutput, double energyRequirement, int sonicFactor)
                   : base(id, oreOutput, energyRequirement /= sonicFactor)
    {
        SonicFactor = sonicFactor;
    }

Така го разбирам:
В първият случай се прави опит за създаване на обект и след това се модифицират свойствата му.
Във втория директно се създава обект със зададените свойства.

При команда: RegisterHarvester Sonic AS-51 100 100000 10
Проверката е if(value > 20_000) throw Exception. 
В първия случай гърми със 100_000.
Във втория минава с 10_000.

Каква е конвенцията?
Кой вариант е правилен? 

1
C# OOP Basics 07/03/2018 23:54:03
Danny_Berova avatar Danny_Berova 205 Точки
Best Answer

Привет! Позволявам си да отговоря, тъй като конструктора, който съм ползвала е като първия вариант, показан тук. Моята логика беше, че когато подаваш параметъра трябва да се проверява директно в базовия клас стойността, която е подадена отвън и да не може изобщо да създаде обект с данни, непокриващи изискването за максимална стойност. От условието "you need to validate that energy requirement for each harveter is NOT over 20000 " за мен означава, че подаденият параметър трябва първо да се провери и валидира, а тази част от условието "UPON INITIALIZATION, divides its given energyRequirement by its sonicFactor." я разбирам така -  първо провери валидност, запази стойността и после създай обект със следната корекция на стойността "energyRequirement / sonicFactor". Не твърдя, че съм 100% права в обясненията си, това е моето тълкуване на условието. Тепърва с практиката ще ни се изясняват много неща.

1