কটলিন এ্যাবস্ট্রাক্ট ক্লাস:
সহজ কথায় যে ক্লাসে abstract কী-ওয়ার্ড ব্যবহার করা হয় সেটাই এ্যাবস্ট্রাক্ট ক্লাস। এ্যাবস্ট্রাক্ট ক্লাস দিয়ে কিন্তু অবজেক্ট তৈরি করা বা ইনস্টেন্স তৈরি করা যায় না। এই ক্লাসের মেথড/ফাংশন ও প্রোপার্টি/ভেরিয়েবল গুলো কিন্তু এ্যাবস্ট্রাক্ট নয় তাই এদেরকে এ্যাবস্ট্রাক্ট করার জন্য আলাদাভাবে abstract কী-ওয়ার্ড ব্যবহার করতে হয়।
এ্যাবস্ট্রাক্ট ক্লাস কেন দরকার?
কোডের তথ্য লুকিয়ে রেখে সিকিউরিটি বাড়ানোর জন্য অর্থাৎ কোড এ্যাবস্ট্রাক্ট করার জন্যই এ্যাবস্ট্রাক্ট ক্লাস দরকার। এছাড়াও এর মাধ্যমে কোন ফাংশন কিংবা প্রোপার্টিকে ওভাররাইড করে ব্যবহারের জন্য বাধ্য করা যায়।
একটি এ্যাবস্ট্রাক্ট ক্লাস এমন হতে পারে:
abstract class MyCarEngine {
abstract var power: Double
abstract fun runEngine()
}
এ্যাবস্ট্রাক্ট ক্লাসে সাধারন ফাংশন রাখতে পারবেন আবার এ্যাবস্ট্রাক্ট ফাংশনও রাখতে পারবেন তবে এ্যাবস্ট্রাক্ট ক্লাসে এ্যাবস্ট্রাক্ট ফাংশন ও এ্যাবস্ট্রাক্ট প্রোপার্টি থাকবে এটাই এ্যাবস্ট্রাক্ট ক্লাসের আসল উদ্দেশ্য। এ্যাবস্ট্রাক্ট ফাংশনের বডি থাকবে না উপরের উদাহরণে যেমনটি দেখানো হয়েছে runEngine() ফাংশনের কোন বডি নাই এবং এ্যাবস্ট্রাক্ট প্রোপার্টিতে ভ্যালু এ্যাসাইন করা যাবে না।
এ্যাবস্ট্রাক্ট ক্লাস অন্য ক্লাসে এক্সটেন্ড করার পর চাইল্ড ক্লাসে ফাংশন ও প্রোপার্টি ওভাররাইড করতে হবে।
যেমন নিচে একটি চাইল্ড ক্লাস দেয়া হলো:
class MyCar : MyCarEngine() {
override var power: Double = 1.3
override fun runEngine() {
// যেহেতু ইঞ্জিন রান করা গাড়ির জন্য অত্যাবশকীয় কাজ
// তাই এই ফাংশনটি লিখতে বাধ্য করবে MyCarEngine এর এ্যাবস্ট্রাক্ট ফাংশন runEngine
println("Engine is running...")
}
fun getCarLocation() { // MyCarEngine ক্লাসের রেফারেন্স থেকে এক্সেস করা যাবে না
println("Car is now in Dhaka")
}
}
এখানে দেখতে পাচ্ছি MyCar ক্লাস MyCarEngine ক্লাসকে এক্সটেন্ড করেছে কোলন চিহ্ন দিয়ে। এরপর ইরর হবে যতক্ষন MyCarEngine (প্যারেন্ট ক্লাস) ক্লাসের প্রোপার্টি ও ফাংশনকে ওভাররাইড না করা হবে। অর্থাৎ চাইল্ড ক্লাসে এ্যাবস্ট্রাক্ট প্রোপার্টি ও এ্যাবস্ট্রাক্ট ফাংশন ওভাররাইড করা বাধ্যতামূলক কিন্তু MyCarEngine (প্যারেন্ট ক্লাস) এ যদি বডি সহ নন-এ্যাবস্ট্রাক্ট ফাংশন থাকতো তবে তা ওভাররাইড না করলেও হতো, বডি সহ নন-এ্যাবস্ট্রাক্ট ফাংশন ওভাররাইড করার জন্য সেটাতে open কী-ওয়ার্ড ব্যবহার করতে হবে।
চাইল্ড ক্লাসে ওভাররাইড করার পর প্রোপার্টিতে ভ্যালু দিতে হবে ও ফাংশনের বডি দিতে হবে।
এখন মেইন ফাংশনের ভিতরে এটা রান করে দেখি:
fun main() {
/**
* অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (OOP)
* এ্যাবস্ট্রাক্ট ক্লাস – abstract class – (Abstraction)
* Hiding implementation logic
*/
val myCar: MyCar = MyCar() // MyCar রেফারেন্স
myCar.runEngine()
myCar.getCarLocation()
val myCar2: MyCarEngine = MyCar() // MyCarEngine রেফারেন্স
myCar2.runEngine()
// myCar2.getCarLocation() // ইরর হবে কারন MyCarEngine রেফারেন্স থেকে এক্সেস করা যাবে না।
}
মেইন ফাংশনে দেখা যাচ্ছে যে MyCar এর রেফারেন্স থেকে runEngine() ও getCarLocation() দুটি ফাংশনই এক্সেস করা যাচ্ছে কিন্তু MyCarEngine রেফারেন্স থেকে শুধু runEngine() ফাংশনে এক্সেস করা যাচ্ছে, getCarLocation() ফাংশনে এক্সেস করা যাচ্ছে না কারন MyCarEngine এ getCarLocation() ফাংশনটি নেই অথচ উভয় ক্ষেত্রেই অবজেক্ট তৈরির জন্য MyCar() কনস্ট্রাক্টর কল করা হয়েছে।
এবার সম্পূর্ণ বিষয়টি অনলাইনে রান করে দেখি, চাইলে নিচের কোড এডিড করে আপনি টেস্ট করতে পারবেন:
রান করতে নিচের সবুজ রঙের রান বাটনে ক্লিক করুন: