শব্দগত যোগাযোগ(ফাও প্যচাল)
বহুরূপতা(Polymorphism), ব্যাপারটার সাথে বাংলার শিক্ষিত জনগন, বিশেষ করে বিজ্ঞান শাখায় পড়ুয়া জনগনের
প্রথম পরিচয় রাসায়নবিদ্যা পড়ার সময়(কার্বনের বহুরূপ যেমন হীরক, গ্রাফাইট ইত্যাদি)। এর পর দিন দিন আমরা বহুরূপী মানুষ,
বহুরূপী অমানুষ ইত্যাদি অনেক কিছুর সাথেই পরিচিত হয়েছি। শেষমেষ যখন সভ্যতার বৈপ্লবিক আবিষ্কার
গনকযন্ত্রের( কম্পিউটারের) সাথে একটা যোগাযোগ স্থাপনের চেষ্টায় প্রোগ্রামিং ভাষা শিখতে গেলাম, তখন আবার নতুন করে
পরিচয় এই বহুরূপতার সাথে।
ভূমিকা(ভনিতা)
প্রোগ্রামিং-এর এই বহুরূপতার(পলিমর্ফিজম) ব্যাপারে প্রথম যখন শ্রেনীকক্ষে স্যারের বক্তৃতা শুনি তখন স্যারের কথা গুলো মাথার
কয়েক হাত উপর দিয়ে যাচ্ছিল, পরে যখন নিজে নিজে অনেক চেষ্টা করে বহুরূপতার ধারনা বুঝতে পারলাম, তখন অন্য কাউকে বুঝাতে
গিয়েও আমি অনুভব করতে পারতাম, যাকে আমি বুঝাচ্ছি তার মাথারও কয়েক হাত উপর দিয়ে যাচ্ছে। এই ধারনাটাই এমন যে,
যারা একদমই নতুন নতুন প্রোগ্রামিং শিখছে, যেমন, ভ্যারিয়েবল, লুপ, এর্যে এইগুলো ব্যাবহার করে মোটামোটি বিভন্ন সমস্যা
সমাধান করতে পারেন, মানে যারা মোটামোটি প্রোগ্রামিং-এর ব্যাপারে আত্মবিশ্বাস অর্জন করা শুরু করেছে, তারদের জন্যও
এই ধারনাটা প্রথমেই বুঝতে পারা একটু কঠিন। বহুরূপীতার ধারনাটা স্পষ্ট করে বুঝার জন্য আগে, অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং
এর ইনহেরিটেন্স, ইন্টার্ফেইসিং এইসব এর ব্যাপারে খুবই স্পষ্ট ধারনা থাকতে হবে। তাই যারা এখনো ভাল করে ইনহেরিটেন্স বুঝিনি
তারা এই লিখা পড়ে পলিমর্ফিজম এর ব্যাপারে ভাল ধারণ পাবেন এই ব্যাপারে আমি নিশ্চিত নয়। যদিও এই লিখায় ইনহেরিটেন্স-এর
ধারনাগত দিক গুলো দিয়েই পলিমর্ফিজম এর আলোচনা শুরু করছি।
তো প্রোগ্রামিং-এ বহুরূপতা(পলিমর্ফিজম) ব্যাপারটা কি?
অব্জেক্ট অরিয়েন্টেড প্রগ্রামিং এ ইনহেরিটেন্স(উত্তরাধিকার) এর ধারনাটা বেশ মজার।
প্রথমত, এখানে করিম আলীর আব্বা জমির আলী যদি তবলা বাজাতে পারে তাহলে, করিম আলীও তবলা বাজাতে পারে। আবার করিম আলীর ভাই সগির আলিও পারে। পাশাপাশি, জমির আলীর যদি ১ কাঠা জমি থাকে তাহলে করিম আলী আর সগির আলীরও ১ কাঠা জমি আছে। মানে, জমির আলীর যত পরবর্তি প্রজন্ম আছে সবাই জমির আলীর সকল গুনাগুন(Function/Method/Behaviour) ও সম্পত্তি(Property) পাবে শুধু মাত্র জমির আলীর একান্ত ব্যাক্তিগত/গোপন(Private) গুনাগুন বা সম্পত্তি ছাড়া।
দ্বিতীয়ত, যেখানে যেখানে করিম আলীর ও সগির আলীর আব্বা জমির আলীর যাওয়ার কথা সেখানে
সেখানে যদি করিম আলী বা সগীর আলিও যায় তাহলেও কেউ কিছু মনে করবে না এমনকি সবাই ধরে নেয় যে জমির আলীই
এসেছে। কারন যদি জমির আলীর জায়গায় করিম আলীয় যায় তবু সে জমীর আলীর মতই সব আচরন করতে পারে কারণ
ঐ যে উত্তরাধিকারের প্রথম শর্ত, বাপের সব গুনাগুনও সম্পত্তি ছেলেরাও পাবে। পাশাপাশি জমীর আলীর ছেলেরা চাইলে
অন্য আরও কোন সম্পত্তির মালিক হতে পারে, তারা তবলার পাশাপাশি গিটার বাজানোও শিখতে পারে। এখানে আরেকটা ব্যাপার
উল্ল্যেখ করা উচিত, তা হলো, যদি এমন হয় যে সগির আলী তার নিজের মত করে তবলা বাজানো শিখে নাই তাহলে সে
হুবুহু তার বাপের মত করে তবলা বাজাবে কারন এটা সরাসরি উত্তরাধিকারী সূত্রে পাওয়া। তো কোন জায়গায় যদি গানের আসর হয়
আর সেখানে তবলা বাজানোর জন্য যদি জমির আলীর যাওয়ার কথা থাকে তাহলে জমির আলী সে আসরে না গিয়ে যদি তার ছেলে
সগির আলী কিংবা করিম আলীকেও পাঠায় তাহলে কেউ কিছু মনে করে না। ব্যাপারটা অনেকটা এমন যেন, আসরের সবাই অন্ধ,
তারা কারও চেহেরা দেখতে পায় না, তারা দেখে তার গুনাগুন। কেউ যদি জমির আলীর মত আচরন করে তাহলে সে জমির আলী,
আর আমরা জানি সগীর আলী কিংবা করিম আলী দুইজনি জমির আলীর মত আচরন করতে পারে। এখানেই আসল মজা,
এখানে শুরু হয় খেলা! কারণ, করিম আলী তবলা বাজায় করিম আলীর মত, আর সগির আলী বাজায় সগির আলীর মত,
জমির আলী বাজাতো জমির আলীর মত। তো তবলার আসরে, সবাই ধরেই নিচ্ছে জমির আলী তবলা বাজাচ্ছে, ক
িন্তু তবলাতো একেকদিন একেজন বাজাচ্ছে, একবার বাজাচ্ছে করিম আলী, আরেকদিন বাজাচ্ছে সগির আলী,
আরেকদিন বাজাচ্ছে জমির আলী নিজে। কিন্তু অন্ধ শ্রোতা তো জানে সব সময় তবলা জমির আলীই বাজাচ্ছে।
আর এভাবেই জমির আলী হয়ে উঠে এক বহুরূপি চরিত্র। আর ঠিক এভাবেই অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং-এও বহুরূপতা কাজ করে।
প্রোগ্রামিং-এ প্রয়োগ
তো উপরের আলোচিত বাপ জমির আলী এবং তার দুই ছেলের করিম আলী আর সগির আলীর যে অবস্থাও সম্পর্ক এটা
যদি আমরা অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এ প্রয়োগ করি তাহলে কেমন হয়? চলুন দেখি...
<?php class JamirAli{ public function playTobola(){ echo "Playing tobola like Jomir Ali"; } }
এই ক্লাস ডিজাইনটিতে দেখা যাচ্ছে, জমির আলী তবলা বাজাতে পারে এবং সে তবলা বাজাচ্ছে তার নিজের স্টাইলে।
<?php class KarimAli extends JamirAli{ public function playTobola(){ echo "Playing tobola like Karim Ali"; } }
এখানে করিম আলী হলো জমির আলীর ছেলে।এই ক্লাসে যদি করিম আলী আলাদা করে নিজের স্টাইলে তবলা বাজানো নাও পারত তবুও সে উত্তরাধিকার সুত্রে তার বাবা জমির আলীর মত তবলা বাজাতে পারত। কিন্তু সে তার বাবার চেয়ে আলাদা করে তবলা বাজানো শিখেছে। এই যে সে তার বাবা গুনাগুন কে নিজের মত করে পরিবর্তন করেছে(ওভাররাইড করেছে), একে অবজেক্ট অরিয়েন্টেড এর ভাষায় বলে মেথড অভাররাইডিং।
<?php class SogirAli extends JamirAli{ public function playGuitar(){ echo "Playing Guitar like Sogir Ali"; } }
এখানে সগির আলীও জমির আলীর ছেলে। তবে সগির আলী ভাবলো, আমিতো উত্তরাধিকার সূত্রেই তবলা বাজাতে পারি,
তাই আমি আর তবলা বাজানো আর আলাদা করে না শিখি, তারচেয়ে বরং গিটার বাজানো শিখি। তার মানে সগির
আলী তার বাবার থেকে উত্তরাধিকার সুত্রে পাওয়া তবলা বাজানোর গুনাগুনকে আবার নিজের মত করে প্রয়োগ করে
নাই(মেথড Override করেনি)।
এবার আমরা গানের আসরের দিকে একটু দেখি...
<?php class GanerAshor{ public function startPlayingTobola(JamirAli $jomirAli){ $jomirAli->playTobola(); } public function startSinging(Singer $hukkaMiya){ $hukkaMiya->sing(); } }
এখানে গানের আসরে startPlayingTobola
নামে একটা কাজ(Method/Functionality) আছে,
তো গানের আসরের এই মেথড কে যখন কেউ কল করবে তখন গানের আসরে জমির আলীকে উপস্থিক
থাকতে হবে। আমরা আগেই বলেছিলাম, জমির আলীকে যেখানে উপস্থিত থাকার কথা যেখানে তার দুই ছেলের যে
কোন একজন থাকলেও কেউ কিছু মনে করবে না। এখন সেটা কিভাবে প্রয়োগ করা যায় দেখি...
<?php $ganerAshor = new GanerAshor();
এই হলো আমাদের গানের আসর...
<?php $jamirAli = new JamirAli(); $ganerAshor->startPlayingTobola($jamirAli); //Output //Playing tobola like Jamir Ali
এখানে কোন সমস্যা নেই, কারণ গানে জমির আলীর যাওয়ার কথা ছিল জমির আলীই গেছে, এবং জমির আলীর স্টাইলেই তবলা বাজিয়েছে। এবার যদি গানের আসরে জমির আলীর জায়গায় করিম আলী যায় তাহলে কি হবে?
<?php $karimAli = new KarimAli(); $ganerAshor->startPlayingTobola($karimAli); //Output //Playing tobola like Karim Ali
ব্যাপারটা বেশ মজার না? গানের আসরে জমির আলীর জায়গায় আমরা করিম আলীকে পাঠিয়েছি, গানের আসরের সবাই
ধরেই নিয়েছে আমরা জমির আলীকেই পাঠিয়েছি, তাই তারা বলল যে, জমির আলী তবলা বাজানো শুরু কর। কিন্তু করিম
আলী তবলা বাজানো শুরু করল করিম আলীর নিজের স্টাইলে। ব্যাপারটা এমন, যেন জমির আলী গানের আসরে করিম
আলীর রূপ নিয়ে এসেছে! যদি গানের আসরে আমরা সগির আলীকে পাঠাতাম তাহলে কি হতো?
<?php $sogirAli = new SogirAli(); $ganerAshor->startPlayingTobola($sogirAli); //Output //Playing tobola like Jamir Ali
এখানে সগির আলীকে আমরা তার বাবা জমির আলীর পরিবর্তে গানের আসরে পাঠিয়েছি, এখানে কেউ বুঝতেই পারেনি
আসলে জমির আলী তবলা বাজাচ্ছে না, তার ছেলে সগির আলী বাজাচ্ছে। কারণ সগীর আলীতো তার বাবার থেকে
উত্তরাধিকার সুত্রে পাওয়া তবলা বাজানোকে আবার নিজের মত করে পরিবর্তন করে নি। তাই এখানে যদিও গানের আসরে
জমির আলীর জায়গায় সগির আলী এসেছে তবুও সে তার বাবা জমির আলীর মতই তবলা বাজাচ্ছে। এখানেও যেন, জমির
আলী তার ছেলে সগির আলীর রূপ নিয়ে গানের আসরে হাজির হয়েছে।
এভাবেই গানের আসরে চিরচেনা তবলা বাধক জমির আলী হয়ে উঠে এক রহস্যময়ী বহুরূপি চরিত্র। সেই সাথে আমরাও দেখতে পাই অবজেক্ট অরিয়েন্টেড এক ভিন্ন রূপ, সবাই বলে বহুরূপতা(Polymorphism)