Variance (In, Out, এবং No Variance)
কটলিনে Variance হলো একটি ধারণা যা জেনেরিক টাইপগুলোর মধ্যে সম্পর্ক প্রতিষ্ঠা করে। Variance ব্যবহারের মাধ্যমে আপনি কোডকে আরও নিরাপদ ও পুনঃব্যবহারযোগ্য করতে পারেন। কটলিনে প্রধানত তিন ধরনের Variance আছে: Invariance, Covariance, এবং Contravariance। নিচে এই ধারণাগুলো নিয়ে বিস্তারিত আলোচনা করা হলো।
১. Invariance
Invariance হলো একটি স্ট্যান্ডার্ড পরিস্থিতি যেখানে আপনি জেনেরিক টাইপের সঠিক টাইপ নির্ধারণ করতে হবে। যদি একটি টাইপ List<Dog> হয়, তাহলে List<Animal> হতে পারবে না, এমনকি যদি Dog Animal এর একটি সাবটাইপও হয়।
উদাহরণ:
class Box<T>(val item: T)
fun main() {
val box1: Box<Animal> = Box(Dog()) // এটি সম্ভব
// val box2: Box<Dog> = box1 // এটি সম্ভব নয়
}
ব্যাখ্যা:
- এখানে
Box<T>এর ইনস্ট্যান্সেAnimalএবংDogআলাদা টাইপ হওয়ায় এটি ইনভারিয়েন্স।Box<Dog>কেBox<Animal>হিসেবে ব্যবহার করা যাবে না।
২. Covariance (Out)
Covariance ব্যবহার করে আপনি টাইপ প্যারামিটারকে out হিসাবে চিহ্নিত করতে পারেন, যা টাইপ হায়ারার্কিতে সাবটাইপকে অনুমতি দেয়। অর্থাৎ, আপনি একটি জেনেরিক টাইপের সাথে শুধুমাত্র রিটার্ন টাইপ হিসাবে কাজ করতে পারবেন।
উদাহরণ:
class Box<out T>(val item: T)
fun main() {
val dogBox: Box<Dog> = Box(Dog())
val animalBox: Box<Animal> = dogBox // এটি সম্ভব
}
ব্যাখ্যা:
- এখানে
Box<out T>এর মাধ্যমেTটাইপের সাথে Covariance প্রকাশ করা হয়েছে।Box<Dog>থেকেBox<Animal>এ রূপান্তর সম্ভব।
৩. Contravariance (In)
Contravariance ব্যবহার করে আপনি টাইপ প্যারামিটারকে in হিসাবে চিহ্নিত করতে পারেন, যা টাইপ হায়ারার্কিতে সুপারটাইপের অনুমতি দেয়। অর্থাৎ, আপনি একটি জেনেরিক টাইপের সাথে শুধুমাত্র ইনপুট টাইপ হিসেবে কাজ করতে পারবেন।
উদাহরণ:
class Box<in T> {
fun add(item: T) {
// কোড যা আইটেম যুক্ত করে
}
}
fun main() {
val box: Box<Animal> = Box()
box.add(Dog()) // এটি সম্ভব, কারণ Dog হল Animal এর সাবটাইপ
}
ব্যাখ্যা:
- এখানে
Box<in T>এর মাধ্যমেTটাইপের সাথে Contravariance প্রকাশ করা হয়েছে।Box<Animal>কেBox<Dog>এর ইনপুট হিসেবে ব্যবহার করা যায়।
৪. No Variance
No Variance হলো এমন পরিস্থিতি যেখানে টাইপ প্যারামিটার কেবলমাত্র এক ধরনের কাজে ব্যবহৃত হয় এবং এতে কোনো Variance নেই। এটি একটি সাধারণ জেনেরিক টাইপ যেখানে Covariance বা Contravariance উভয়ই নেই।
উদাহরণ:
class Box<T>(val item: T)
fun main() {
val box: Box<Dog> = Box(Dog())
// box.item = Animal() // এটি সম্ভব নয়
}
ব্যাখ্যা:
- এখানে
Box<T>একটি সাধারণ জেনেরিক ক্লাস, যেখানে কোনো Variance নেই।itemএর টাইপ নির্দিষ্ট করা হয়েছে, তাই এটি ইনভারিয়েন্ট।
উপসংহার
কটলিনে Variance টাইপ সেফটি নিশ্চিত করতে এবং জেনেরিক টাইপগুলোর মধ্যে সম্পর্ক স্থাপন করতে সাহায্য করে। Covariance (out) এবং Contravariance (in) এর মাধ্যমে আপনি টাইপের হায়ারার্কি ব্যবহার করে কোডকে আরও ফ্লেক্সিবল করতে পারেন, আর Invariance সাধারণ ব্যবহার নিশ্চিত করে।
Read more