জাভাস্ক্রিপ্টে 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;
}
}
}