আজ থেকে তুই ত্যাজ্য Inheritance
বাংলা সিনেমায় অনেক সময় ডায়লগ দেয়— আজ থেকে তোকে আমি ত্যাজ্যপুত্র ঘোষণা করলাম। আমার সব সহায়-সম্পদ থেকে তোকে বঞ্চিত করলাম।
অর্থাৎ ত্যাজ্যপুত্র বা ত্যাজ্যকন্যা ঘোষণা করার মানে হচ্ছে, বাবা-মা থেকে উত্তরাধিকারসূত্রে কোনো সম্পত্তি পাবে না। উত্তরাধিকার একটা কঠিন শব্দ, এইটার কঠিন একটা ইংরেজি শব্দ আছে, সেটাকে inheritance বলে।
আপাতত বাংলা সিনেমা সাইডে রেখে প্রোগ্রামিংয়ের কথা চিন্তা কর।
একটা বড়সড় সফটওয়্যার বানাতে প্রচুর কোড লিখতে হয়। প্রচুর মানে প্রচুর। সেখানে কয়েকশত ক্লাস লিখে ফেললেও অবাক হওয়ার কিছু থাকে না। আর যদি কাছাকাছি টাইপের অনেকগুলা ক্লাস লিখতে হয়। যেমন ধর, আমার কাছে তিনটা ক্লাস আছে Laptop, Phone আর Tablet। এইগুলার শুধু প্রোপার্টি দেখাচ্ছি।
class Laptop {
constructor(brand, model, price, keyboardLight) {
this.brand = brand;
this.model = model;
this.price = price;
this.keyboardLight = keyboardLight;
}
}
class Phone {
constructor(brand, model, price, hasFaceUnlock, cameraCount) {
this.brand = brand;
this.model = model;
this.price = price;
this.hasFaceUnlock = hasFaceUnlock;
this.cameraCount = cameraCount;
}
}
class Tablet {
constructor(brand, model, price, hasPen) {
this.brand = brand;
this.model = model;
this.price = price;
this.hasPen = hasPen;
}
}তুই একটু খেয়াল করলে বুঝতে পারবি, এই তিনটা ক্লাসের মধ্যেই কিন্তু তিনটা প্রোপার্টি কমন। সবগুলারই কিন্তু brand, model, price প্রোপার্টি আছে। আর সবগুলার জন্যই বারবার এই তিনটা প্রোপার্টির নাম লেখা লাগছে। তবে তুই চাইলে এই জিনিস একবার লিখে সব ক্লাসে ইউজ করতে পারবি।
এইটার জন্য তোকে এই তিনটার কমন একটা ক্লাস লিখতে হবে। যে ক্লাসকে অনেক সময় প্যারেন্ট ক্লাস বলে। অনেকটা তোর বাবা-মার মতো। তোর বাবা-মার সম্পদ যেমন তুই উত্তরাধিকারসূত্রে পেয়ে যাস, তেমনি একইভাবে আমরা একটা কমন ক্লাস লিখতে পারি। তারপর সেই ক্লাসের সাথে আমাদের ক্লাসগুলোর একটা আংটা লাগায় ফেলতে পারি। তাহলে কমন ক্লাস বা প্যারেন্ট ক্লাসের যত প্রোপার্টি আর যত মেথড আছে, সব চাইল্ড ক্লাসগুলো পেয়ে যাবে।
এই প্যারেন্ট আর চাইল্ড রিলেশনশিপ সেট করতে চাইলে তোকে দুইটা কাজ করতে হবে এবং দুইটা স্পেশাল কি-ওয়ার্ড ইউজ করতে হবে।
এক্সটেনশন কর্ড
extends একটা ইংরেজি শব্দ, এইটার মানে হলো বাড়ানো বা বর্ধন করা। তাই একটা ক্লাস (প্যারেন্ট ক্লাস) থেকে তার প্রোপার্টি আর মেথডকে extend করা লাগবে। সেজন্য প্রথমে প্যারেন্ট ক্লাস লিখতে হয়। যার প্রোপার্টি এবং মেথড অন্য ক্লাসগুলো পাবে। তারপর চাইল্ড ক্লাস লেখার সময় চাইল্ড ক্লাসের নাম লেখার পর extends লিখে এরপর প্যারেন্ট ক্লাস লিখতে হয়। যেমন ধর, আমার প্যারেন্ট ক্লাস হচ্ছে Gadget আর চাইল্ড ক্লাস হচ্ছে Laptop, তাহলে আমি নিচের মতো করে লিখব।
class Gadget {
}
class Laptop extends Gadget {
}সুপার ডুপার প্যারেন্ট
সাধরণত প্যারেন্ট ক্লাসে constructor মেথড থাকে এবং সেই constructor মেথডের ভিতরে কিছু প্রোপার্টির মান সেট করা হয়। যেগুলা সব চাইল্ড ক্লাসের জন্য কমন থাকবে। অন্যদিকে চাইল্ড ক্লাসের নিজস্ব কিছু প্রোপার্টি থাকে। তাই চাইল্ড ক্লাসে constructor-এর মধ্যে কিছু প্যারামিটার নিতে হয়। যেগুলা চাইল্ড ক্লাসে এবং প্যারেন্ট ক্লাসে প্রোপার্টির মান হিসেবে সেট করা লাগে।
চাইল্ড ক্লাসের প্রোপার্টিগুলা সহজেই সেট করে দিতে পারবি। অন্যদিকে যদি প্যারেন্ট ক্লাসের প্রোপার্টি হয়, তখন প্যারেন্ট ক্লাসের constructor-কে কল করে তাকে প্যারামিটারগুলো দিতে হবে। আর প্যারেন্ট ক্লাসের constructor-কে কল করার জন্য super নাম দিয়ে কল করতে হয়।
নিচের কোডে দেখবি, Laptop ক্লাসের নামের পর extends লিখে তারপর Gadget লেখা হয়েছে। এইটা দিয়ে বুঝা যায়, Laptop ক্লাস Gadget ক্লাসের সব প্রোপার্টি এবং মেথড পাবে এবং Laptop ক্লাসের constructor মেথডে দেখতে পাবি চারটা প্যারামিটার নিচ্ছে। এর মধ্যে তিনটা প্যারামিটার দিয়ে super মেথডকে কল করতেছে। এই তিনটা প্যারামিটার আসলে Gadget ক্লাসের প্যারামিটার। এ ছাড়া ল্যাপটপের নিজস্ব একটা প্রোপার্টি আছে keyboardLight, সেটা সে চাইল্ড ক্লাসেই সেট করে ফেলতেছে।
// Parent Class
class Gadget {
constructor(brand, model, price) {
this.brand = brand;
this.model = model;
this.price = price;
}
}
// Child Class: Laptop
class Laptop extends Gadget {
constructor(brand, model, price, keyboardLight) {
super(brand, model, price);
this.keyboardLight = keyboardLight;
}
}
const myLaptop = new Laptop("Dell", "XPS 15", 1500, true);
console.log(myLaptop.brand);
console.log(myLaptop.model);
console.log(myLaptop.price);
console.log(myLaptop.keyboardLight);
Output:
Dell
XPS 15
1500
trueযদিও ল্যাপটপ ক্লাসের নিজস্ব কোনো ব্র্যান্ড বা প্রাইস বা মডেল প্রোপার্টি নাই। সে gadget ক্লাসের প্রোপার্টি উত্তরাধিকারসূত্রে পাচ্ছে। সেজন্য gadget হচ্ছে প্যারেন্ট ক্লাস, আর Laptop হচ্ছে চাইল্ড। সেইম প্যারেন্ট দিয়ে আমরা অনেক চাইল্ড ক্লাস বানাতে পারি। যেমন: নিচে আমরা Phone নামে আরেকটা ক্লাস লিখছি, যেটা Gadget থেকে inherit করতেছে।
class Phone extends Gadget {
constructor(brand, model, price, hasFaceUnlock) {
super(brand, model, price);
this.hasFaceUnlock = hasFaceUnlock;
}
}
const myPhone = new Phone("Apple", "iPhone 14", 999, true);
console.log(myPhone.brand);
console.log(myPhone.hasFaceUnlock);
Output:
Apple
trueএকদম সেইম সিস্টেমে তুই Tablet ক্লাসও বানাতে পারবি—
class Tablet extends Gadget {
constructor(brand, model, price, hasPen) {
super(brand, model, price);
this.hasPen = hasPen;
}
}
const myTablet = new Tablet("Samsung", "Galaxy Tab S8", 700, true);
console.log(myTablet.brand);
console.log(myTablet.hasPen);
Output:
Samsung
trueতারমানে ইনহেরিটেন্স ইউজ করার কারণে সেইম প্রোপার্টি সব ক্লাসে লেখার দরকার পড়ে নাই। একইভাবে প্রোপার্টির মতো মেথডও প্যারেন্ট ক্লাসে থাকলে সেটা চাইল্ড ক্লাস অটোমেটিকভাবে পেয়ে যাবে।
যখন কাছাকাছি টাইপের অনেকগুলা ক্লাসের কথা চিন্তা করবি, তখন বের করার চেষ্টা করবি, কোন কোন প্রোপার্টি আর মেথডগুলা কমন, আর কোন কোন প্রোপার্টিগুলা আনকমন। কমন প্রোপার্টি আর কমন মেথডগুলা চলে যাবে প্যারেন্ট ক্লাসে। তাহলে সব ক্লাসের জন্য এই জিনিসগুলো রিপিট করা হবে না। আর আনকমন প্রোপার্টি আর মেথডগুলা থাকবে চাইল্ড ক্লাসের মধ্যে।
কারণ, কোডের মধ্যে যতসম্ভব রিপিট কমাতে হবে। সেজন্য অনেক সময় বলা হয় কোড DRY রাখবে। DRY বলতে বুঝায় Don't Repeat Yourself
Practice:
- ইনহেরিটেন্স কী জিনিস? এইটা কেন দরকার?
- প্যারেন্ট আর চাইল্ড ক্লাসের মধ্যে সম্পর্ক কীভাবে তৈরি হয়।
- বেশ কয়েক রকমের যানবাহনের কথা চিন্তা কর। Bus, Truck আর bike। প্রথমে এদের জন্য তোর ইচ্ছামতো (চিন্তা করে করে ) মিনিমাম 5টা করে প্রোপার্টি যোগ কর। তারপর দেখ, কোন কোন প্রোপার্টি কমন, আর কোন কোন প্রোপার্টি আনকমন। তারপর কমন প্রোপার্টিগুলা নিয়ে একটা প্যারেন্ট ক্লাস বানিয়ে ফেল। এরপর প্যারেন্ট ক্লাসকে extends করে চাইল্ড ক্লাসের সাথে রিলেশন বিল্ড কর। তারপর সবগুলা চাইল্ড ক্লাস থেকে অবজেক্ট বানিয়ে চেক করে দেখ, কমন এবং আনকমন সব ধরনের প্রোপার্টি পাচ্ছস কি না।
- Animal, Bird আর Fish নিয়ে চিন্তা কর। প্রত্যেকের জন্য মিনিমাম 5টা করে প্রোপার্টি বানিয়ে দেখ, কোনগুলো কমন। কমন প্রোপার্টিগুলো Parent Class-এ রাখ, আর আনকমনগুলো Child Class-এ। সবগুলো ক্লাস থেকে অবজেক্ট তৈরি করে প্রোপার্টিগুলো ঠিকঠাক কাজ করছে কি না, চেক কর।
- Furniture ক্লাস বানিয়ে তার চাইল্ড হিসেবে Chair আর Table তৈরি কর। কমন প্রোপার্টিগুলো Parent-এ রাখ। তারপর Chair আর Table-এর আলাদা আলাদা প্রোপার্টি আর মেথড যোগ কর।
- পোষা প্রাণীদের নিয়ে কাজ কর। Dog, Cat আর Parrot-এর আলাদা ক্লাস বানা। আগে Parent ক্লাস বানিয়ে কমন ফিচারগুলো সেখান থেকে ইনহেরিট কর।
- DRY প্রিন্সিপাল উদাহরণসহ ব্যাখ্যা কর।