Loading...

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

alek1339 avatar alek1339 57 Точки

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

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

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

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

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

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

Тагове:
0
JavaScript Advanced
RoYaL avatar RoYaL Trainer 6849 Точки
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 6849 Точки

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

 

2
alek1339 avatar alek1339 57 Точки

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

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

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

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