JavaScript OOP හි උරුමකම් ලබන අවස්ථාවේ පෞද්ගලික ගුණාංග පිළිබඳ ගැටලුව
පෞද්ගලික ගුණාංග උරුම නොලැබීම, අනපේක්ෂිත ගැටලුවකට මග පාදා දිය හැකිය. අපි උදාහරණයක් බලමු. පහත දැක්වෙන පෞද්ගලික ගුණාංගයක් සහිත මාපි පන්තියක් අප සතුව ඇතැයි සිතමු:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
උපපන්තියේදී, වයස එකකින් වැඩි කරන ක්රමයක් සෑදීමට අප තීරණය කළා යැයි සිතමු. කෙසේ වෙතත්, මාපිගේ පෞද්ගලික ගුණාංගය වෙනස් කිරීමට උත්සාහ කිරීම දෝෂයක් ඇති කරයි:
class Student extends User {
incAge() {
this.#age++; // දෝෂය
}
}
උපපන්තිය තුළ පෞද්ගලික ගුණාංගය #age
ප්රකාශයට පත් කළහොත් දෝෂය අතුරුදහන් වේ:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
මෙන්න, මෙහිදී අපව උගුලක් බලා සිටින්නේ! ඇත්ත වශයෙන්ම අපි පෞද්ගලික ගුණාංග දෙකක් සෑදූ වරයෙමු: එකක් මාපියෙකු තුළ සහ එකක් උපපන්තිය තුළ. ඒවා ක්රියා කරන්නේ සම්පූර්ණයෙන්ම ස්වාධීනව ය. මෙයින් අදහස් වන්නේ, මාපිගේ ක්රම මාපිගේම ගුණාංග වෙනස් කරන අතර, උපපන්තියේ ක්රම තමන්ගේම ගුණාංග වෙනස් කරන බවයි.
මෙම ගැටලුවට ඇත්ත වශයෙන්ම විසඳුමක් ඇත. ඒ වෙනුවට මාපිගේ පෞද්ගලික ගුණාංග එම මාපිගේ ක්රම හරහා හසුරුවීමට අවශ්ය වේ. අපි අපගේ කේතය මෙයට අනුකූලව යළි ලියමු:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
සරල කළ හැකිය:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
පහත කේතයේ, උපපන්තිය තුළ මාපිගේ ක්රමය ප්රතිසංවිධානය කෙරේ. මෙම කේතයේ ඇති ගැටලු නිරාකරණය කරන්න:
class User {
#name;
setName(name) {
this.#name = name;
}
getName() {
return this.#name;
}
}
class Employee extends User {
setName(name) {
if (name.length > 0) {
this.#name = name;
}
}
}