একাধিক উত্তরাধিকার কেন সি ++ এ সম্ভব, তবে সি # তে নয়?
আমি মনে করি (কঠোর রেফারেন্স ছাড়াই), জাভাতে তারা ভাষা শিখতে সহজ করার জন্য ভাষার স্পর্শকাতরতা সীমাবদ্ধ করতে চেয়েছিল এবং একাধিক উত্তরাধিকার ব্যবহারের কোডটি তার নিজের ভালোর জন্য প্রায়শই জটিল নয়। এবং কারণ সম্পূর্ণ একাধিক উত্তরাধিকার বাস্তবায়ন করা আরও জটিল, তাই এটি ভার্চুয়াল মেশিনটিকে আরও অনেক সহজ করে তুলেছে (একাধিক উত্তরাধিকার বিশেষত আবর্জনা সংগ্রহকারীকে সাথে খারাপভাবে মিথস্ক্রিয়া করে, কারণ এর জন্য বস্তুর মাঝখানে পয়েন্টার রাখা প্রয়োজন (বেসের শুরুতে)) )
এবং সি # ডিজাইন করার সময় আমার মনে হয় তারা জাভাটির দিকে তাকিয়েছে, দেখেছিল যে সম্পূর্ণ একাধিক উত্তরাধিকারটি খুব বেশি মিস হয়নি এবং জিনিসগুলি সহজ রাখার জন্যও নির্বাচিত হয়নি।
সি ++ একাধিক বেস শ্রেণি থেকে উত্তরাধিকারসূত্রে অভিন্ন পদ্ধতি স্বাক্ষরগুলির অস্পষ্টতা কীভাবে সমাধান করবে?
এটা না । স্পষ্টভাবে নির্দিষ্ট বেস থেকে বেস বর্গ পদ্ধতি কল করার একটি বাক্য গঠন রয়েছে, তবে কেবলমাত্র ভার্চুয়াল পদ্ধতিগুলির মধ্যে একটির ওভাররাইড করার কোনও উপায় নেই এবং যদি আপনি সাবক্লাসে পদ্ধতিটি ওভাররাইড না করেন তবে বেসটি নির্দিষ্ট না করে কল করা সম্ভব নয় বর্গ।
এবং কেন একই নকশাকে সি # তে অন্তর্ভুক্ত করা হচ্ছে না?
অন্তর্ভুক্ত করার মতো কিছুই নেই।
যেহেতু জর্জিও মন্তব্যে ইন্টারফেস এক্সটেনশন পদ্ধতিগুলি উল্লেখ করেছে, তাই আমি ব্যাখ্যা করব যে মিশ্রণগুলি কী এবং কীভাবে সেগুলি বিভিন্ন ভাষায় প্রয়োগ করা হয়।
জাভা এবং সি # তে ইন্টারফেস কেবলমাত্র ঘোষণার পদ্ধতিগুলির মধ্যে সীমাবদ্ধ। তবে পদ্ধতিগুলি ইন্টারফেসটির উত্তরাধিকার সূত্রে প্রাপ্ত প্রতিটি শ্রেণিতে প্রয়োগ করতে হবে। ইন্টারফেসের বৃহত্তর শ্রেণি রয়েছে তবে এটি অন্যের শর্তে কিছু পদ্ধতির ডিফল্ট বাস্তবায়ন সরবরাহ করতে কার্যকর। সাধারণ উদাহরণটি তুলনীয় (ছদ্ম-ভাষায়):
mixin IComparable {
public bool operator<(IComparable r) = 0;
public bool operator>(IComparable r) { return r < this; }
public bool operator<=(IComparable r) { return !(r < this); }
public bool operator>=(IComparable r) { return !(r > this); }
public bool operator==(IComparable r) { return !(r < this) && !(r > this); }
public bool operator!=(IComparable r) { return r < this || r > this; }
};
পূর্ণ শ্রেণীর থেকে পার্থক্য হ'ল এতে কোনও ডেটা সদস্য থাকতে পারে না। এটি বাস্তবায়নের জন্য বেশ কয়েকটি বিকল্প রয়েছে। স্পষ্টতই একাধিক উত্তরাধিকার এক। তবে একাধিক উত্তরাধিকার বাস্তবায়নের চেয়ে জটিল। তবে এখানে আসলে এটির দরকার নেই। পরিবর্তে, অনেকগুলি ভাষা ইন্টারফেসে মিক্সিনকে বিভক্ত করে এটিকে প্রয়োগ করে, যা শ্রেণি দ্বারা প্রয়োগ করা হয় এবং পদ্ধতি প্রয়োগের একটি ভাণ্ডার, যা হয় নিজেই ক্লাসে প্রবেশ করা হয় বা একটি মধ্যবর্তী বেস শ্রেণি তৈরি হয় এবং সেগুলি সেখানে স্থাপন করা হয়। এটি রুবি এবং ডি তে প্রয়োগ করা হয়েছে, জাভা 8 এ প্রয়োগ করা হবে এবং কৌতূহলীভাবে পুনরাবৃত্তি টেম্পলেট প্যাটার্নটি ব্যবহার করে সি ++ এ ম্যানুয়ালি প্রয়োগ করা যেতে পারে । উপরের, সিআরটিপি আকারে, দেখে মনে হচ্ছে:
template <typename Derived>
class IComparable {
const Derived &_d() const { return static_cast<const Derived &>(*this); }
public:
bool operator>(const IComparable &r) const { r._d() < _d(); }
bool operator<=(const IComparable &r) const { !(r._d() < _d(); }
...
};
এবং ব্যবহার করা হয়:
class Concrete : public IComparable<Concrete> { ... };
এটি নিয়মিত বেস শ্রেণীর হিসাবে ভার্চুয়াল হিসাবে ঘোষণার কোনও প্রয়োজন হয় না, সুতরাং যদি টেমপ্লেটগুলিতে ইন্টারফেস ব্যবহার করা হয় তবে কার্যকর অপটিমাইজেশন বিকল্পগুলি খোলে। দ্রষ্টব্য, সি ++ এ সম্ভবত দ্বিতীয় পিতামাতার হিসাবে উত্তরাধিকার সূত্রে প্রাপ্ত হবে তবে যে ভাষাগুলিতে একাধিক উত্তরাধিকারের অনুমতি দেয় না এটি একক উত্তরাধিকার শৃঙ্খলে allowোকানো হয়, তাই এটি আরও পছন্দ
template <typename Derived, typename Base>
class IComparable : public Base { ... };
class Concrete : public IComparable<Concrete, Base> { ... };
সংকলক বাস্তবায়ন ভার্চুয়াল প্রেরণ এড়াতে বা নাও পারে।
সি # তে একটি আলাদা বাস্তবায়ন নির্বাচন করা হয়েছিল। সি # তে বাস্তবায়নগুলি সম্পূর্ণ পৃথক শ্রেণির স্থির পদ্ধতি এবং প্রদত্ত নামের কোনও পদ্ধতি উপস্থিত না থাকলে মেথড কল সিনট্যাক্সটি যথাযথভাবে সংকলক দ্বারা ব্যাখ্যা করা হয় তবে একটি "এক্সটেনশন পদ্ধতি" সংজ্ঞায়িত করা হয়। এটির সুবিধাটি রয়েছে যে ইতিমধ্যে সংকলিত শ্রেণিতে এক্সটেনশন পদ্ধতিগুলি যুক্ত করা যেতে পারে এবং এমন পদ্ধতিগুলি যেমন অনুকূলিত সংস্করণ সরবরাহ করতে পারে না যেমন উদ্বোধন করা যায় না।