কোভেরিয়েন্স (Covariance) এবং কনট্রাভেরিয়েন্স (Contravariance) সাধারণত টাইপ প্যারামিটারাইজড ক্লাস বা জেনেরিক্সের সঙ্গে সম্পর্কিত কনসেপ্ট। স্কালায় এই ধারণাগুলি কাজ করে যখন আপনি টাইপের উত্তরাধিকারের (inheritance) সম্পর্ক এবং সাধারণভাবে টাইপ সিস্টেমের মধ্যে সম্পর্কগুলো বিশ্লেষণ করেন।
কোভেরিয়েন্স এবং কনট্রাভেরিয়েন্স সাধারণভাবে টাইপের সম্পর্ককে বর্ণনা করে, যেমনঃ
- কোভেরিয়েন্স: উপরের ধাপের টাস্কগুলির জন্য টাইপ প্যারামিটার যখন একটি টাইপের উপর ইনহেরিট করা হয় এবং তারা একে অপরের মধ্যে সম্পর্ক বজায় রাখে।
- কনট্রাভেরিয়েন্স: উপরের ধাপের টাস্কগুলির জন্য টাইপ প্যারামিটার যখন একটি টাইপের নিচের ধাপের জন্য ইনহেরিট করা হয়, এবং একে অপরের মধ্যে সম্পর্ক বজায় রাখে।
এই দুটি ধারণা স্কালার টাইপ প্যারামিটারাইজড ক্লাসগুলির জন্য বিশেষভাবে গুরুত্বপূর্ণ।
১. কোভেরিয়েন্স (Covariance)
কোভেরিয়েন্স তখন ঘটে যখন একটি টাইপ A থেকে অন্য টাইপ B ইনহেরিট করার ফলে টাইপের মধ্যে সম্পর্ক বজায় থাকে। কোভারিয়েন্ট টাইপ প্যারামিটার দিয়ে তৈরি ক্লাসগুলো তাদের ইনহেরিটেড টাইপের সঙ্গে সম্পর্কিত থাকে।
স্কালায় কোভারিয়েন্স সাধারণত +T সিনট্যাক্স দিয়ে প্রকাশ করা হয়। এখানে T হচ্ছে টাইপ প্যারামিটার এবং + কোভারিয়েন্স নির্দেশ করে।
১.১ কোভেরিয়েন্স উদাহরণ
উদাহরণ ১: কোভারিয়েন্সের উদাহরণ:
class Animal
class Dog extends Animal
// Covariant container
class Box[+T] {
def get: T = ???
}
// Box[Dog] is a subtype of Box[Animal]
val dogBox: Box[Dog] = new Box[Dog]
val animalBox: Box[Animal] = dogBox // This works due to covarianceএখানে:
Box[+T]ক্লাসটি কোভারিয়েন্ট (covariant), অর্থাৎBox[Dog]Box[Animal]এর সাবটাইপ হতে পারে কারণDogহলAnimalএর সাবটাইপ।
কোভেরিয়েন্সের সুবিধা:
- কোভারিয়েন্ট ক্লাসগুলো আপনাকে একটি টাইপের সাবটাইপ ব্যবহার করতে দেয়, যার ফলে কোড পুনঃব্যবহারযোগ্য এবং ফ্লেক্সিবল হয়।
২. কনট্রাভেরিয়েন্স (Contravariance)
কনট্রাভেরিয়েন্স তখন ঘটে যখন একটি টাইপ A থেকে অন্য টাইপ B ইনহেরিট করার ফলে তাদের সম্পর্ক বিপরীত হয়ে যায়। কনট্রাভেরিয়েন্ট টাইপ প্যারামিটার দিয়ে তৈরি ক্লাসগুলো তার ইনহেরিটেড টাইপের বিপরীত সম্পর্ক বজায় রাখে।
স্কালায় কনট্রাভেরিয়েন্স সাধারণত -T সিনট্যাক্স দিয়ে প্রকাশ করা হয়। এখানে T হচ্ছে টাইপ প্যারামিটার এবং - কনট্রাভেরিয়েন্স নির্দেশ করে।
২.১ কনট্রাভেরিয়েন্স উদাহরণ
উদাহরণ ২: কনট্রাভেরিয়েন্সের উদাহরণ:
class Animal
class Dog extends Animal
// Contravariant container
class Printer[-T] {
def print(value: T): Unit = println(value)
}
// Printer[Animal] can accept Printer[Dog] because of contravariance
val animalPrinter: Printer[Animal] = new Printer[Dog]এখানে:
Printer[-T]ক্লাসটি কনট্রাভেরিয়েন্ট (contravariant), অর্থাৎPrinter[Animal]একটিPrinter[Dog]কে গ্রহণ করতে পারে। এটি বিপরীত সম্পর্ক তৈরি করে কারণDogহলAnimalএর সাবটাইপ, এবং আমরাPrinterক্লাসে তার বিপরীত রূপ ব্যবহার করতে পারি।
কনট্রাভেরিয়েন্সের সুবিধা:
- কনট্রাভেরিয়েন্ট টাইপ প্যারামিটার ক্লাসগুলি আপনাকে ইনপুট ধরনের উপর আরও শক্তিশালী নিয়ন্ত্রণ দেয়, যেমন আপনি
Dogটাইপের ইনপুট নিতে পারেন যেখানেAnimalটাইপের ইনপুট প্রয়োজন।
৩. কোভেরিয়েন্স এবং কনট্রাভেরিয়েন্সের মধ্যে পার্থক্য
| বৈশিষ্ট্য | কোভেরিয়েন্স (Covariance) | কনট্রাভেরিয়েন্স (Contravariance) |
|---|---|---|
| টাইপ সম্পর্ক | সাবটাইপ সম্পর্ক বজায় থাকে | বিপরীত সম্পর্ক বজায় থাকে |
| সিনট্যাক্স | +T | -T |
| ইনহেরিটেন্স | সাবটাইপের উপরে কাজ করে | সুপারটাইপের উপর কাজ করে |
| ব্যবহার | রিটার্ন টাইপের জন্য ব্যবহার করা হয় | ইনপুট (প্যারামিটার) টাইপের জন্য ব্যবহার করা হয় |
৪. অ্যাপ্লিকেশন উদাহরণ
কোভেরিয়েন্স এবং কনট্রাভেরিয়েন্সের কম্বিনেশন উদাহরণ:
class Animal
class Dog extends Animal
class Cat extends Animal
class Box[+T] {
def get: T = ???
}
// Covariant - Box[Dog] is a subtype of Box[Animal]
val dogBox: Box[Dog] = new Box[Dog]
val animalBox: Box[Animal] = dogBox
class Printer[-T] {
def print(value: T): Unit = println(value)
}
// Contravariant - Printer[Animal] can accept Printer[Dog]
val printer: Printer[Dog] = new Printer[Animal]এখানে, Box[+T] কোভারিয়েন্ট টাইপ প্যারামিটার এবং Printer[-T] কনট্রাভেরিয়েন্ট টাইপ প্যারামিটার ক্লাস হিসেবে ব্যবহার করা হয়েছে। কোভারিয়েন্সে আমরা Box[Dog] কে Box[Animal] হিসেবে ব্যবহার করতে পারি, এবং কনট্রাভেরিয়েন্সে Printer[Animal] কে Printer[Dog] হিসেবে ব্যবহার করতে পারি।
সারাংশ
- কোভেরিয়েন্স হল টাইপ সম্পর্ক যা সাবটাইপের মধ্যে বজায় থাকে এবং সাধারণত আউটপুট টাইপ বা রিটার্ন টাইপের জন্য ব্যবহৃত হয়।
- কনট্রাভেরিয়েন্স হল টাইপ সম্পর্ক যা সুপারটাইপের মধ্যে বজায় থাকে এবং সাধারণত ইনপুট বা প্যারামিটার টাইপের জন্য ব্যবহৃত হয়।
- স্কালায়
+Tএবং-Tসিনট্যাক্স ব্যবহার করে টাইপ প্যারামিটারগুলির মধ্যে কোভারিয়েন্স এবং কনট্রাভেরিয়েন্স কার্যকরীভাবে পরিচালনা করা হয়।
এই ধারণাগুলি সাধারণভাবে জেনেরিক্স, টাইপ প্যারামিটারাইজড ক্লাস, এবং ফাংশনাল প্রোগ্রামিং এর বিভিন্ন ক্ষেত্রে খুবই গুরুত্বপূর্ণ এবং উপকারী।
Read more