Професионална програма
Loading...
alek1339 avatar alek1339 57 Точки

Помощ с задача за JS OOP

Здравейте, опитвам се да се упражнявам и намерих задача, но не мога да измисля как да я направя. Някой ако може да ме насочи малко. Идеята е такава:

Имам 4 вида танка, 3 разделени по големина и един летящ. И в зависимост от големината им се определя колко им е голям двигателя, колко бързо ускоряват и т.н.

Като родител от който трябва да се наследява 1 танк ли трябва да имам, защото общо взето те май имат еднакви пропартита но само като имена а стойностите на всички са различни. И ако имам един танк родител как ще разбира точно какви стойности да дава на детето танк. Или това което ми се вижа по-лесно, но ми се струва като по не правилния начин за решение на задачата е да имам 4 различни танка и всеки да си съдържа своите пропартита. 

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

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

Тагове:
0
JavaScript Advanced
RoYaL avatar RoYaL Trainer 6847 Точки
Best Answer

Летящият танк има ли си големина? Т.е. имаш "голям танк", "малък танк" и "летящ танк" или може да имаш и "летящ малък танк" и "летящ голям танк". Ще продължа напред като ще счета, че първият вариант е валиден.

Кои стойности са по подразбиране и кои идват от потребителя?

Т.е. задължително ли знаем, че "малък танк" тежи 2 тона, а "голям танк" тези 6 тона?

Ако е така, стойностите ги направи дефолтни за децата на "Tank";

Да речем, че имаш абстрактния Tank:

var Tank = (function() {

     function Tank(name) {

         this._name = name;

     }

 

     Tank.prototype.getWeight = function() { return this._weight; }

     Tank.prototype.getName = function() { return this._name; }

     return Tank;

}());

 

Това, което трябва да направиш, например, е в наследникът, примерно Малък танк, да сложиш стойност за тегло т.е. 2 тона:

 

var SmallTank = (function() {

     function SmallTank(name) {

         Tank.apply(this, name);

     }

     SmallTank.inherits(Tank);

     SmallTank.prototype._weight = 2;

     return SmallTank;

}());

 

така при създаване на малък танк с каквото и да е име, той ще тежи 2 тона.

var myTank = new SmallTank("paisii");

console.log(myTank.getWeight()); // 2

console.log(myTank.getName()); // paisii

 

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

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

Да речем, че Един танк тежащ един тон ускорява със "100" единици. Колкото по-тежък е, толкова по-бавно ускорява. Т.е. пропорционално, ако е 2 тона ще ускорява с 50 единици.

Приемаме, че ГолямТанк няма как да тежи по-малко то 6 тона, но може да тежи нагоре колкото пожелае потребителя.

Тогава ми се струва валидно и следното в класа BigTank:

var BASE_ACCELERATION = 200;

BigTank.prototype.setWeight = function(weight) {

    if (weight < 6) throw new Error("too small BigTank");

    this._weight = weight;

}

BigTank.prototype.setAcceleration = function() {

    this._acceleration = BASE_ACCELERATION / this.getWeight();

}

 

И съответно в конструктора ги викаш едно след друго

 

function BigTank(name, weight) {

    Tank.apply(name, this);

    this.setWeight(weight);

    this.setAcceleration();

}

 

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

var myTank = new BigTank("KozminMoci", 40);

console.log(myTank.getWeight()); // 40

console.log(myTank.getAcceleration()); // 5

 

4
03/12/2014 10:43:16
alek1339 avatar alek1339 57 Точки

Супер го обясни, благодаря. Нещо което го знам е:

 return this._weight;  

връща:

SmallTank.prototype._weight = 2;

правилно ли съм разбрал ?

0
RoYaL avatar RoYaL Trainer 6847 Точки

Точно така, каквото променлива закачиш за прототипа, може да я достъпиш с this. през обекта. Съответния гетър (getWeight()) ще върне стойността на prototype._weight, която за SmallTank е 2.

 

2
alek1339 avatar alek1339 57 Точки

Тук, защо се прави с SmallTank.inherits(Tank); 

с кое е по различно inherits от това да му наследяваме прототипа ?

п.с. мерси за едита на отговора и , че още повече разшири обяснението

0
RoYaL avatar RoYaL Trainer 6847 Точки

inherits е нищо :) Просто не ми се пишеха 3 реда код отгоре и го написах така с идеята, че означава че наследяваш (Object.create от прототипа на парента) :)

Иначе обикновено си правя функция inherits към прототипа на всеки обект, за да не пиша всеки път Object.create и наследявнане на конструктора.

    Object.prototype.inherits = function(parent) {
        this.prototype = Object.create(parent.prototype);
        this.prototype.constructor = this;
    }

0
alek1339 avatar alek1339 57 Точки

мн. ми помогна

0