Abstract Classes এবং Interfaces
কটলিনে Abstract Classes এবং Interfaces ব্যবহার করে অ্যাবস্ট্রাকশন এবং ফ্লেক্সিবিলিটি আনা যায়। এদের মাধ্যমে আপনি কটলিনে মডুলার, রিইউজেবল এবং মেইনটেইনেবল কোড তৈরি করতে পারেন। এরা দুটোই অ্যাবস্ট্রাকশন তৈরি করতে ব্যবহৃত হলেও এদের মধ্যে কিছু পার্থক্য রয়েছে। নিচে এই দুইটি বিষয়ের উপর বিস্তারিত আলোচনা করা হলো।
১. Abstract Classes
Abstract Classes হলো এমন ক্লাস যেগুলো থেকে সরাসরি অবজেক্ট তৈরি করা যায় না। এগুলো সাধারণত কিছু সাধারণ প্রোপার্টি এবং মেথড ডিফাইন করে, যেগুলোকে সাবক্লাসে ওভাররাইড করে ইমপ্লিমেন্ট করতে হয়। কটলিনে abstract কীওয়ার্ড ব্যবহার করে একটি ক্লাস এবং মেথডকে অ্যাবস্ট্রাক্ট করা হয়।
Abstract Class উদাহরণ:
abstract class Animal {
abstract val name: String
abstract fun sound()
fun eat() {
println("$name is eating.")
}
}
class Dog : Animal() {
override val name: String = "Dog"
override fun sound() {
println("Bark")
}
}
ব্যাখ্যা:
Animalহলো একটিabstractক্লাস যা একটিabstractপ্রোপার্টি (name) এবং একটিabstractমেথড (sound()) ধারণ করে।eat()হলো একটি সাধারণ মেথড যা ইমপ্লিমেন্ট করা হয়েছে এবং এটি সকল সাবক্লাসে ব্যবহৃত হতে পারে।Dogক্লাসটিAnimalথেকে ইনহেরিট করে এবংnameএবংsound()মেথড ইমপ্লিমেন্ট করে।
Abstract Class ব্যবহার কেন?
- যখন কিছু সাধারণ ফাংশনালিটি (যেমন:
eat()) সব সাবক্লাসে শেয়ার করতে হয়, কিন্তু কিছু নির্দিষ্ট ফাংশনালিটি (যেমন:sound()) প্রতিটি সাবক্লাসে আলাদা ভাবে ইমপ্লিমেন্ট করতে হয়। - অ্যাবস্ট্রাক্ট ক্লাস ইনহেরিট করতে হলে কটলিনে সাবক্লাসগুলোকে
openকরতে হয় না, কারণ অ্যাবস্ট্রাক্ট ক্লাস ডিফল্টভাবেopenথাকে।
২. Interfaces
Interfaces হলো এমন এক ধরনের ব্লুপ্রিন্ট যা শুধুমাত্র ফাংশনালিটি ঘোষণা করে। এটি ক্লাস বা অবজেক্টকে নির্দিষ্ট ফাংশনালিটি ইমপ্লিমেন্ট করতে বাধ্য করে। কটলিনে interface কীওয়ার্ড ব্যবহার করে ইন্টারফেস ডিক্লেয়ার করা হয়। কটলিনে একটি ক্লাস একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারে, যা মাল্টিপল ইনহেরিটেন্সের মতো কাজ করে।
Interface উদাহরণ:
interface Animal {
val name: String
fun sound()
fun eat() {
println("$name is eating.")
}
}
class Cat : Animal {
override val name: String = "Cat"
override fun sound() {
println("Meow")
}
}
ব্যাখ্যা:
Animalহলো একটি ইন্টারফেস যা একটি প্রোপার্টি (name), একটি ফাংশন (sound()), এবং একটি ডিফল্ট ফাংশন (eat()) ডিফাইন করে।Catক্লাসটিAnimalইন্টারফেস ইমপ্লিমেন্ট করে এবং এতে থাকা প্রোপার্টি এবং মেথডগুলো ওভাররাইড করে।
Interface ব্যবহার কেন?
- যখন আপনি চান একটি ক্লাস একাধিক ফাংশনালিটি ইমপ্লিমেন্ট করুক। কটলিনে একটি ক্লাস একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারে, কিন্তু একাধিক ক্লাস ইনহেরিট করতে পারে না।
- ইন্টারফেসে ডিফল্ট মেথডও থাকতে পারে যা প্রয়োজন অনুযায়ী ওভাররাইড করা যায়।
মাল্টিপল ইন্টারফেস ইমপ্লিমেন্ট করা:
interface Animal {
fun sound()
}
interface Pet {
fun play()
}
class Bird : Animal, Pet {
override fun sound() {
println("Chirp")
}
override fun play() {
println("Bird is playing")
}
}
Birdক্লাসটিAnimalএবংPetদুটি ইন্টারফেস ইমপ্লিমেন্ট করছে এবং তাদের মেথডগুলো ওভাররাইড করেছে।
Abstract Classes এবং Interfaces-এর পার্থক্য
| ফিচার | Abstract Class | Interface |
|---|---|---|
| ইনস্ট্যান্স তৈরি | ইনস্ট্যান্স তৈরি করা যায় না | ইনস্ট্যান্স তৈরি করা যায় না |
| মাল্টিপল ইনহেরিটেন্স | একটি ক্লাস একাধিক অ্যাবস্ট্রাক্ট ক্লাস ইনহেরিট করতে পারে না | একটি ক্লাস একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারে |
| প্রোপার্টি | প্রোপার্টি হোল্ড করতে পারে | শুধুমাত্র অ্যাবস্ট্রাক্ট প্রোপার্টি ঘোষণা করতে পারে |
| কন্সট্রাক্টর | কন্সট্রাক্টর থাকতে পারে | কন্সট্রাক্টর থাকতে পারে না |
| মেথড | অ্যাবস্ট্রাক্ট এবং নন-অ্যাবস্ট্রাক্ট মেথড থাকতে পারে | শুধুমাত্র অ্যাবস্ট্রাক্ট এবং ডিফল্ট মেথড থাকতে পারে |
উপসংহার
কটলিনে Abstract Classes এবং Interfaces অ্যাবস্ট্রাকশন এবং মডুলারিটি নিশ্চিত করতে সাহায্য করে। এগুলো ব্যবহার করে আপনি ক্লাসের মধ্যে সাধারণ ফাংশনালিটি শেয়ার করতে পারেন এবং একই সাথে নির্দিষ্ট ফাংশনালিটি প্রতিটি সাবক্লাস বা ইমপ্লিমেন্টিং ক্লাসে আলাদাভাবে তৈরি করতে পারেন।