Използване на overriden property за модифицане на друго property от същия клас наследник
Здравейте.
В предна инстанция на курса чух, че е по-правилно ако искаме да променим някое свойство на клас наследник (например да го увеличим с 50%) то е по-добре да се направи въпросното свойство виртуално в бащиния клас и да се презапише в наследника. Нямах проблем с това когато се налага да се направи с константа, но как е правилно да се направи ако текущото свойство зависи от друго свойство на същия клас?
Ето тук например(от последния изпит) ми трябва EnergyRequirement да го разделя на SonicFactor като и двете са свойства на клас SonicHarvester който наследява Harvester: https://github.com/gaydov/Softuni-OOP-Basics/blob/master/Exams/Exam-16th-July-2017/HarvestersModels/SonicHarvester.cs
Не успях да го направя, защото SonicFactor все още няма стойност и винаги деля на 0.
Ето имплементацията когато просто се ползва константа: https://github.com/gaydov/Softuni-OOP-Basics/blob/master/Exams/Exam-16th-July-2017/HarvestersModels/HammerHarvester.cs
Та как е най-правилно да се направи това и изобщо възможно ли е да е по-добрия начин с презаписване на EnergyRequirement по някакъв начин?
Няма да се получи зацикляне в сетъра, ако се разграничат базовото пропърти от овъррайда. Т.е. със синтаксиса :
this.EnergyRequirement = base.EnergyRequirement / this.SonicFactor;
Бях експериментирал подобни конструкции в една задача. В овъррайднатият метод можеш с base. да викаш едноименният предшественик и няма проблем - работи си.
Martin.T това е ново двайсе :) Изглежда добре обаче. И аз не знам доколко е валидно.
Pilgrimage, получава си се зацикляне, защото реално ползваш едно и също нещо. Може и да не го структурирам като хората все пак.
И аз като теб имах същите съмнения. Но го проверих (не сега, преди седмица). И се оказа, че тази конструкция работи.
Защото когато имаш override, вече не е едно и също. :-)
Всъщност експеримента ми беше свързан с това да имам private поле, на което да override-вам пропъртито в наследника.