মডিউল পাঠ (1/2)
উত্তরাধিকার
উত্তরাধিকার হল OOP-এর একটি মৌলিক প্রক্রিয়া যা একটি শ্রেণীকে (একটি শিশু শ্রেণী বা সাবক্লাস বলা হয়) অন্য শ্রেণীর (একটি অভিভাবক শ্রেণী বা সুপারক্লাস বলা হয়) থেকে ক্ষেত্র এবং পদ্ধতিগুলিকে উত্তরাধিকারী হতে দেয়।
এটি কোড পুনঃব্যবহার প্রচার করে এবং অপ্রয়োজনীয় পুনরাবৃত্তি এড়ায়।
extends এর সাথে একটি ক্লাস বাড়ানো হচ্ছে
জাভাতে, আমরা extends কীওয়ার্ড ব্যবহার করি যে একটি শ্রেণী অন্যের থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়:
class Vehicle {
protected int speed; // 'protected' makes the field visible to subclasses
public void honk() {
System.out.println("Beep beep!");
}
}
class Car extends Vehicle {
// Car automatically inherits the speed field and the honk() method
}কনস্ট্রাক্টর এবং super() কীওয়ার্ড
যদি সুপারক্লাসের একটি কনস্ট্রাক্টর থাকে যা পরামিতিগুলি গ্রহণ করে, তাহলে সাবক্লাসটিকে অবশ্যই super(...) ব্যবহার করে প্রথম বিবৃতি হিসাবে স্পষ্টভাবে তার কন্সট্রাকটরটিতে কল করতে হবে:
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
class Student extends Person {
int studentId;
public Student(String name, int studentId) {
super(name); // Invokes the constructor of Person
this.studentId = studentId;
}
}পদ্ধতি ওভাররাইডিং (@Override)
একটি সাবক্লাস সুপারক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত একটি পদ্ধতির জন্য নিজস্ব নির্দিষ্ট বাস্তবায়ন প্রদান করতে পারে। এই অপারেশনটিকে ওভাররাইডিং (পদ্ধতি ওভাররাইডিং) বলা হয় এবং এটি @Override টীকা দ্বারা নির্দেশিত।
class Animal {
public void makeSound() {
System.out.println("Rumore generico");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Miao!");
}
}protected সংশোধক
protected অ্যাক্সেস মডিফায়ার উত্তরাধিকারে একটি মুখ্য ভূমিকা পালন করে। private এর বিপরীতে, যা সদস্যদের শুধুমাত্র একই ক্লাসের মধ্যে দৃশ্যমান করে, protected একই প্যাকেজের মধ্যে এবং সমস্ত সাবক্লাস উভয় ক্ষেত্রেই ক্ষেত্র এবং পদ্ধতিতে অ্যাক্সেসের অনুমতি দেয়, এমনকি যদি তারা বিভিন্ন প্যাকেজে থাকে।
super এর মাধ্যমে অভিভাবক সদস্যদের অ্যাক্সেস করা
সুপারক্লাস কনস্ট্রাক্টরকে কল করার পাশাপাশি, super কীওয়ার্ডটি প্যারেন্ট ক্লাসের রেফারেন্স পদ্ধতি বা ভেরিয়েবলের জন্য সাবক্লাস পদ্ধতির মধ্যে ব্যবহার করা যেতে পারে। এটি বিশেষভাবে উপযোগী যখন একটি পদ্ধতি ওভাররাইড করা হয়, কিন্তু আপনি এখনও মূল অভিভাবক আচরণকে আহ্বান করতে চান:
class Animal {
public void sleep() {
System.out.println("Zzz");
}
}
class Cat extends Animal {
@Override
public void sleep() {
super.sleep(); // Executes the behavior of Animal
System.out.println("The cat purrs while sleeping.");
}
}জাভাতে একক উত্তরাধিকার
জাভাতে, একটি শ্রেণী শুধু একটি শ্রেণী (একক উত্তরাধিকার) প্রসারিত করতে পারে। একাধিক শ্রেণী (একাধিক উত্তরাধিকার) থেকে সরাসরি উত্তরাধিকার অনুমোদিত নয়; উদাহরণস্বরূপ, class Cat extends Animal, Mammal একটি সংকলন ত্রুটি সৃষ্টি করবে। এই নকশা পছন্দটি "হীরা সমস্যা" নামে পরিচিত অস্পষ্টতা এড়িয়ে যায় (যখন দুটি সুপারক্লাস একই পদ্ধতিকে বিভিন্ন বাস্তবায়নের সাথে সংজ্ঞায়িত করে)। এই সীমাবদ্ধতা কাটিয়ে ওঠার জন্য, জাভা ইন্টারফেস ধারণাটি প্রবর্তন করেছে, যা আমরা পরবর্তী মডিউলে অন্বেষণ করব।
নিজে চেষ্টা করে দেখুন
প্রাণীকে প্রসারিত করে কুকুরের সাবক্লাসটি সম্পূর্ণ করুন। ডগ কনস্ট্রাক্টর ঘোষণা করুন যে একটি নাম (স্ট্রিং) গ্রহণ করে এবং এটি প্রাণী কনস্ট্রাক্টরের কাছে পাস করতে সুপার (নাম) ব্যবহার করে।
ইঙ্গিত দেখান
লিখুন `public Dog(string name) { super(name); }` কুকুর ক্লাসের ভিতরে।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
Animal থেকে Dog প্রসারিত করুন এবং makeSound() পদ্ধতিকে ওভাররাইড করুন যাতে এটি জেনেরিক সাউন্ডের পরিবর্তে স্ট্রিং উফ ফেরত দেয়। @ওভাররাইড টীকা ব্যবহার করুন।
ইঙ্গিত দেখান
ঘোষণার উপরে `@Override` লিখুন `public String makeSound() { ফেরত 'Woof'; }` কুকুরের ভিতরে।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
একটি ক্যাট ক্লাস ঘোষণা করুন যা প্রাণীকে প্রসারিত করে এবং মেক স্ট্রিংটি ফেরাতে makeSound() পদ্ধতিকে ওভাররাইড করে। পশু শ্রেণীর ইতিমধ্যেই একটি কন্সট্রাক্টর রয়েছে যা একটি নাম গ্রহণ করে; নিশ্চিত করুন যে ক্যাট কনস্ট্রাক্টরও একটি নাম গ্রহণ করে এবং সঠিকভাবে সুপারক্লাস কনস্ট্রাক্টরকে দেয়।
ইঙ্গিত দেখান
'প্রাণী' প্রসারিত করে 'বিড়াল' শ্রেণী তৈরি করুন। কনস্ট্রাক্টর ঘোষণা করুন `পাবলিক ক্যাট(স্ট্রিং নাম) { সুপার(নাম); }` এবং `Meow'` ফেরাতে `@Override` ব্যবহার করে `makeSound()` পদ্ধতিটি ওভাররাইড করুন।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ