Vivasoft-logo

১০.৩ জেনেরিক ফাংশন এবং মেথড

১০.৩.১ জেনেরিক প্যারামিটার সহ ফাংশন তৈরি করা:

জেনেরিক প্যারামিটার গ্রহণ করে এমন একটি ফাংশন তৈরি করতে, আমাদের নিম্নলিখিত কাজগুলি গুলি করতে হবে:
ফাংশন নামের পরে টাইপ প্যারামিটার যোগ করুন, (কোণ বন্ধনীর মধ্যে আবদ্ধ করে)জেনেরিক প্যারামিটার ঘোষণা করতে টাইপ প্যারামিটার ব্যবহার করুন। উদাহরণস্বরূপ, int param1 এর মত কিছু লেখার পরিবর্তে, আমরা T param1 লিখব। স্পষ্টভাবে বোঝার জন্য নীচের উদাহরণ দেখুন. অনুগ্রহ করে মনে রাখবেন আপনি যেকোন সংখ্যক টাইপ প্যারামিটার যোগ করতে পারেন। আমরা শুধুমাত্র দুটি দেখিয়েছি (T&V).

void functionName<T, V>(T param1, V param2){
    ...
}
 

এবং এটি ব্যবহার করার জন্য, আমরা লিখি:

// first type parameter is int, second one is double.
functionName(1, 1.5);
// first type parameter is double, and the second one is String.
functionName(1.0, "xyz");
 

আমরা যদি আমাদের চুক্তি অনুসরণ না করি তাহলে আমরা একটি কম্পাইল টাইম এরর (Error) পাব। যেমন আমরা যদি functionName(1, “xyz”); লিখি, তাহলে আমরা একটি কম্পাইল টাইম এরর পাব। কারণ আমরা একটি ডাবলের জায়গায় একটি স্ট্রিং রেখেছি।

আমরা ফাংশন কল করার সময় টাইপ প্যারামিটার বাদ দিলেও বেশিরভাগ আধুনিক IDE (Integrated Development Environment) কাজ করবে।
উদাহরণস্বরূপ, আমরা উপরের ফাংশনটি লিখতে পারি:

// first type parameter is int, second one is num.
functionName(1, 1.5);
// first type parameter is num, and the second one is String.
functionName(1.0, "xyz");
 


লক্ষ্য করুন, আমরা কোনো প্রকার প্যারামিটার যোগ করিনি (কোণ বন্ধনীর মধ্যে), এবং এটি এখনও কাজ করে। এর কারণ হল IDE এবং কম্পাইলার রানটাইমে টাইপ নির্ধারণ করার জন্য যথেষ্ট স্মার্ট। একটি গুরুত্বপূর্ণ বিষয় হল যে, অনুমানকৃত টাইপ প্যারামিটারের ক্ষেত্রে, এটি একটি প্যারামিটারের ধরন হিসাবে সর্বাধিক শীর্ষে থাকা অভিভাবক ক্লাস কে বিবেচনা করতে পারে। উদাহরণস্বরূপ, উপরের উদাহরণে, কম্পাইলার 1, 1.5, 1.0 কে একটি num টাইপ মান হিসাবে বিবেচনা করতে পারে।

১০.৩.২ জেনেরিক রিটার্ন টাইপ যুক্ত ফাংশন তৈরি করা:

একটি সাধারণ টাইপ প্রদান করে এমন একটি ফাংশন তৈরি করতে, আমাদের নিম্নলিখিতগুলি করতে হবে: একইভাবে আগের মতো, ফাংশনের নামের পরে টাইপ প্যারামিটার (T) (যেটি ফেরত দিতে হবে) যোগ করুন (কোণ বন্ধনীর মধ্যে). এখনো রিটার্ন টাইপ দিবেন না। টাইপ প্যারামিটারটিকে ফাংশনের রিটার্ন টাইপ হিসাবে রাখুন। অবশ্যই, আপনাকে T টাইপ বা এটির যেকোনো উপ-প্রকারের একটি ইনস্ট্যান্স রিটার্ন করতে হবে।

স্পষ্ট বোঝার জন্য নীচের উদাহরণ দেখুন. অনুগ্রহ করে মনে রাখবেন, আপনি শুধুমাত্র একটি রিটার্ন টাইপ যোগ করতে পারেন। এছাড়াও আপনি List বা অন্য কোনো যৌগিক প্রকার ফেরত দিতে পারেন যার মধ্যে আপনার উল্লেখ করা জেনেরিক প্রকার অন্তর্ভুক্ত রয়েছে।

T functionName(...){
    ...
    return an_instance_of_T;
}
 

১০.৩.৩ জেনেরিক প্যারামিটার এবং রিটার্ন-এর সমন্বয়

এমন একটি ফাংশন তৈরি করতে যা জেনেরিক টাইপ গ্রহণ করে এবং ফেরত দেয়, আমাদের নিম্নলিখিতগুলি করতে হবে:
একইভাবে আগের মতো, ফাংশনের নামের পরে টাইপ প্যারামিটার (উভয়, ফাংশন প্যারামিটার এবং রিটার্ন টাইপ) যোগ করুন (কোণ বন্ধনীর মধ্যে)। ফাংশনের রিটার্ন টাইপ হিসাবে রিটার্নিং টাইপ প্যারামিটার (যেটি রিটার্ন টাইপ হিসাবে ব্যবহার করা হচ্ছে) রাখুন এবং ফাংশন প্যারামিটার হিসাবে সংশ্লিষ্ট টাইপ প্যারামিটার যোগ করুন। অবশ্যই, আপনাকে রিটার্নিং টাইপের একটি ইনস্ট্যান্স বা এটির যেকোনো উপ-প্রকার ফেরত দিতে হবে।

স্পষ্ট বোঝার জন্য নীচের উদাহরণ দেখুন. অনুগ্রহ করে মনে রাখবেন, আপনি শুধুমাত্র একটি রিটার্ন টাইপ যোগ করতে পারেন। এছাড়াও আপনি List বা অন্য কোনো যৌগিক প্রকার ফেরত দিতে পারেন যার মধ্যে আপনার উল্লেখ করা জেনেরিক প্রকার অন্তর্ভুক্ত রয়েছে।

O functionName(I input){
    ...
    return an_instance_of_O;
}
 

উদাহরণস্বরূপ, আমরা এটি এভাবে ব্যবহার করতে পারি:

// example function definition.
// ignore the new keywords, we will get to know it later.
O functionName(I input){
    // we have to convert the return value to O
    return sqrt(input) as O;
}
// use of the function
// prints 1.4142....
print(functionName(2));

আমি জানি উপরের উদাহরণটি খুবই বিভ্রান্তিকর কারণ আমরা কিছু নতুন কীওয়ার্ড যুক্ত করেছি। এটা অর্থহীনও মনে হতে পারে। কিন্তু আপাতত জেনে রাখুন যে রিটার্নের টাইপ গুলি ও জেনেরিক হতে পারে এবং এটির গুরুত্বপূর্ণ ব্যবহারের ক্ষেত্র রয়েছে। আমরা শীঘ্রই একটি বাস্তব উদাহরণ দেখব।