Abstract Class এবং Interface দুটি গুরুত্বপূর্ণ ধারণা Java-তে, যেগুলি সাধারণত ইন্টারভিউ প্রশ্নে আসে। উভয়ই একটি ক্লাসের ভেরিয়েবল এবং মেথডের সংজ্ঞা (definition) সরবরাহ করতে সহায়তা করে, তবে তাদের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে। নিচে এই দুইটির মধ্যে পার্থক্য এবং তাদের ব্যবহারের ক্ষেত্রগুলো বিস্তারিতভাবে আলোচনা করা হলো:
1. Abstract Class (অ্যাবস্ট্র্যাক্ট ক্লাস)
- ডিফিনেশন: একটি abstract class এমন একটি ক্লাস, যা সরাসরি ইনস্ট্যান্স (অবজেক্ট) তৈরি করা যায় না, তবে এটি অন্যান্য ক্লাস থেকে ইনহেরিট করা যেতে পারে। এটি পূর্ণাঙ্গ (concrete) মেথড এবং বিমূর্ত (abstract) মেথড উভয়ই থাকতে পারে।
- বৈশিষ্ট্য:
- মেথড: একটি abstract class তে abstract মেথড থাকতে পারে (যেগুলোর কোনো ইমপ্লিমেন্টেশন নেই) এবং concrete মেথড থাকতে পারে (যেগুলোর ইমপ্লিমেন্টেশন থাকে)।
- ডেটা মেম্বার: এটি সাধারণভাবে ইনস্ট্যান্স ভেরিয়েবল (non-static) এবং static ভেরিয়েবল ধারণ করতে পারে।
- কনস্ট্রাক্টর: abstract class কনস্ট্রাক্টর থাকতে পারে, যা ইনহেরিটিং ক্লাসের জন্য ব্যবহার করা যেতে পারে।
- ইনহেরিটেন্স: এটি একাধিক ইনহেরিটেন্স সমর্থন করে না। এক ক্লাস শুধুমাত্র একটি abstract class থেকে ইনহেরিট করতে পারে।
উদাহরণ:
abstract class Animal {
abstract void sound(); // abstract method
void sleep() { // concrete method
System.out.println("Animal is sleeping");
}
}
class Dog extends Animal {
void sound() {
System.out.println("Woof");
}
}
2. Interface (ইন্টারফেস)
- ডিফিনেশন: একটি interface শুধুমাত্র মেথডের সাইনেচার (signature) সংজ্ঞায়িত করে, তবে এর কোনো ইমপ্লিমেন্টেশন থাকে না। যে কোনো ক্লাস এটি ইমপ্লিমেন্ট (implement) করতে পারে এবং তার প্রয়োজনীয় ইমপ্লিমেন্টেশন প্রদান করতে পারে।
- বৈশিষ্ট্য:
- মেথড: একটি interface তে সব মেথড abstract হয়, এবং আগের Java সংস্করণে এগুলোর ইমপ্লিমেন্টেশন থাকত না। Java 8 থেকে, interfaces-এ default এবং static মেথডের ইমপ্লিমেন্টেশন প্রদান করা সম্ভব।
- ডেটা মেম্বার: interface তে সব ভেরিয়েবল public static final হয় (যদিও এগুলোর মান পরিবর্তনযোগ্য নয়)।
- ইনহেরিটেন্স: একটি ক্লাস একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারে, যা Java-এ multiple inheritance এর সমাধান হিসেবে ব্যবহৃত হয়।
- কনস্ট্রাক্টর: interface এর কোনো কনস্ট্রাক্টর থাকে না।
উদাহরণ:
interface Animal {
void sound(); // abstract method
default void sleep() { // default method with implementation
System.out.println("Animal is sleeping");
}
}
class Dog implements Animal {
public void sound() {
System.out.println("Woof");
}
}
Abstract Class এবং Interface এর মধ্যে পার্থক্য:
| বৈশিষ্ট্য | Abstract Class | Interface |
|---|---|---|
| মেথড ইমপ্লিমেন্টেশন | এটি concrete (পূর্ণাঙ্গ) মেথড এবং abstract মেথড থাকতে পারে। | সব মেথড default বা static ছাড়া abstract থাকে। |
| Multiple Inheritance | একাধিক ইনহেরিটেন্স সমর্থন করে না। | একাধিক ইন্টারফেস ইমপ্লিমেন্ট করা যায়। |
| ভেরিয়েবল | সাধারণভাবে instance variables এবং static variables থাকতে পারে। | সব ভেরিয়েবল public static final হয়। |
| কনস্ট্রাক্টর | এটি কনস্ট্রাক্টর থাকতে পারে। | কনস্ট্রাক্টর থাকে না। |
| ইনহেরিটেন্স | একটি ক্লাস শুধুমাত্র একটি abstract class থেকে ইনহেরিট করতে পারে। | একটি ক্লাস একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারে। |
| বিভিন্ন মেথড টাইপ | abstract, static, final, synchronized মেথড থাকতে পারে। | শুধুমাত্র abstract, default, static মেথড থাকতে পারে। |
| বাইন্ডিং টাইম | এটি compile-time binding (early binding) ব্যবহার করে। | এটি runtime binding (late binding) ব্যবহার করে। |
কখন Abstract Class এবং Interface ব্যবহার করবেন?
- Abstract Class: যখন আপনাকে কিছু সাধারণ ফাংশনালিটি (concrete methods) এবং কিছু একে অপরের মধ্যে ভাগ করা আচরণ (common behavior) শেয়ার করতে হয়, তখন abstract class ব্যবহার করা উপযুক্ত।
- Interface: যখন আপনি একাধিক ভিন্ন ভিন্ন ক্লাসে একই ধরনের আচরণ (behavior) প্রয়োগ করতে চান এবং আপনার পক্ষে একাধিক ক্লাসে আচরণ শেয়ার করা সম্ভব না হলে (multiple inheritance), তখন ইন্টারফেস ব্যবহার করা উচিত।
Abstract class এবং Interface দুটি গুরুত্বপূর্ণ কনসেপ্ট Java তে, তবে তাদের মধ্যে পার্থক্যগুলি পরিষ্কারভাবে বুঝে, সঠিক সময়ে সঠিক ব্যবহার করতে হবে। Abstract class সাধারণত সাধারণ বৈশিষ্ট্য এবং আচরণ শেয়ার করতে ব্যবহৃত হয়, যেখানে interface একটি শূন্য শ্রেণি হিসাবে কার্যকরী পদ্ধতি ঘোষণা করে যা একাধিক ক্লাসে ইমপ্লিমেন্ট করা যায়।
Read more