Thursday, November 3, 2016

জাভা ইন্টারফেস এর ক্ষেত্রে multiple inheritance সাপোর্ট করলেও ক্লাসের ক্ষেত্রে কেনো করে না ?

জাভা প্রোগ্রামিং ল্যাংগুয়েজের ডিজাইনাররা কয়েকটি গুরুত্বপূর্ণ বিষয় মাথায় রেখে এই ল্যাংগুয়েজকে ডিজাইন করে। এগুলো হলো-
  1. এটি হতে হবে খুবই সিম্পল, অবজেক্ট ওরিয়েন্টেড এবং পরিচিত, অর্থাৎ যারা তখন সি বা সি++ জানতো তারা যাতে করে সহজেই বুঝতে পারে।
  2. এটিকে অবশ্যই অনেক শক্তসমর্থ এবং নিরাপদ (robust and secure) হতে হবে।
  3. এটি যেকোন অপারেটিং সিস্টেমে চলবে।
  4. এর পারফর্মেন্স অনেক ভাল হতে হবে ।
  5. এটি ইন্টারপ্রেটেড, থ্রেডেড এবং ডাইনামিক হতে হবে। (এখানে বলে রাখি, জাভা যদিও কম্পাইল্ড ল্যাংগুয়েজ, কিন্তু জাভা ভার্চুয়াল মেশিন মূলত বাইটকোড ইন্টারপ্রেট করে আর জেভিএম একটা ডাইনামিক মেশিন)।
এই কয়কেটা উদ্দেশ্যের সাথে আরেকটি গুরুত্বপূর্ণ জিনিস হলো- এর ল্যাংগুয়েজ ফিচার খুব অল্প হতে হবে যাতে একজন প্রোগ্রামার খুব সহজেই মনে রাখতে পারে। যেসব ফিচার খুব ঝামেলাযুক্ত এবং আসলে তেমন প্রয়োজন নেই খুবএকটা সেগুলোকে তারা বাদ দিয়ে ডিজাইন করেছে। যেমন- অপারেটর ওভারলোডিং, মাল্টিপল ইনহেরিটেন্স। এগুলো সুবিধার চেয়ে প্রোগ্রামারদের অসুবিধার কারণ বেশি তৈরি করে।
মাল্টিপল ইনহেরিটেন্সের ক্ষেত্রে একটি বড় সমস্যা হলো ডাইমন্ড সমস্যা। একটি উদাহরণ দেওয়া যাক- মনে কর, একটি ক্লাস A, একে B ও C এক্সটেন্ড করে। আবার আরেকটি ক্লাস D যা কিনা B ও C কে এক্সটেন্ড করে। এখন ধরো, যদি A এর কোনো একটি মেথডকে B ও C দুটিই ওভারাইড করে। এখন যদি D থেকে সেই মেথডটি কল করতে চাও, তাহলে সেটি কোন ক্লাসের মেথডকে কল করবে ? B না C ? সমস্যাটি নিশ্চয় বোঝা যাচ্ছে? 
ইন্টারফেসের ক্ষেত্রে এই সমস্যা হওয়ার কোন উপায় নেই, কারণ প্রত্যেকটি ক্লাস যেহেতু মেথডগুলো ইম্প্লিমেন্ট করবে, তাই সবাই আসলে নিজের মেথডকেই কল করবে।
জাভা ডিজাইনাররা এরকম সমস্যার মধ্য দিয়ে যেতে চায় নি। তাই জাভাতে মাল্টিপল ইনহেরিটেন্স নেই।

Ref: http://programabad.com/questions/5613/multiple-inheritence/5614