সি ++ কীভাবে ভাগ করা সাধারণ পূর্বপুরুষের সাথে একাধিক উত্তরাধিকার পরিচালনা করে?


13

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


3
সম্পূর্ণতার জন্য, "হীরক সমস্যা" দয়া করে কী?
jcolebrand

1
@jcolebrand en.wikipedia.org/wiki/Multiple_inheritance ডায়মন্ড সমস্যা দেখেন
l46kok

1
অবশ্যই, আমি এটি গুগল করেছি, তবে কীভাবে জানব যে সন্দীপ এর অর্থ? আপনি যদি কোনও অস্পষ্ট নামের সাথে কিছু উল্লেখ করতে চলেছেন, যখন "ভাগ করা সাধারণ পূর্বপুরুষের সাথে একাধিক উত্তরাধিকার" আরও সরাসরি হয় ...
jcolebrand

1
@ jcolebrand আমি প্রশ্নটি থেকে কী পেয়েছি তা প্রতিফলিত করার জন্য এটি সম্পাদনা করেছি। আমি ধরে নিই তার অর্থ হীরা সমস্যাটি প্রসঙ্গ থেকে উইকিপিডিয়ায় রেফারেন্স হয়েছে। পরের বার বন্ধুত্বপূর্ণ মন্তব্যটি ফেলে দিন এবং চকচকে নতুন প্রস্তাবিত সম্পাদনা সরঞ্জামটি ব্যবহার করুন :)
আর্লজ

1
@ ইয়ারলজ কেবল তখনই কাজ করে যখন আমি রেফারেন্সটি বুঝতে পারি। অন্যথায় আমি একটি খারাপ সম্পাদনা করছি, এবং এটি কেবল খারাপ জুজু।
jcolebrand

উত্তর:


24

একাধিক উত্তরাধিকার কেন সি ++ এ সম্ভব, তবে সি # তে নয়?

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

এবং সি # ডিজাইন করার সময় আমার মনে হয় তারা জাভাটির দিকে তাকিয়েছে, দেখেছিল যে সম্পূর্ণ একাধিক উত্তরাধিকারটি খুব বেশি মিস হয়নি এবং জিনিসগুলি সহজ রাখার জন্যও নির্বাচিত হয়নি।

সি ++ একাধিক বেস শ্রেণি থেকে উত্তরাধিকারসূত্রে অভিন্ন পদ্ধতি স্বাক্ষরগুলির অস্পষ্টতা কীভাবে সমাধান করবে?

এটা না । স্পষ্টভাবে নির্দিষ্ট বেস থেকে বেস বর্গ পদ্ধতি কল করার একটি বাক্য গঠন রয়েছে, তবে কেবলমাত্র ভার্চুয়াল পদ্ধতিগুলির মধ্যে একটির ওভাররাইড করার কোনও উপায় নেই এবং যদি আপনি সাবক্লাসে পদ্ধতিটি ওভাররাইড না করেন তবে বেসটি নির্দিষ্ট না করে কল করা সম্ভব নয় বর্গ।

এবং কেন একই নকশাকে সি # তে অন্তর্ভুক্ত করা হচ্ছে না?

অন্তর্ভুক্ত করার মতো কিছুই নেই।


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

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

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> { ... };

সংকলক বাস্তবায়ন ভার্চুয়াল প্রেরণ এড়াতে বা নাও পারে।

সি # তে একটি আলাদা বাস্তবায়ন নির্বাচন করা হয়েছিল। সি # তে বাস্তবায়নগুলি সম্পূর্ণ পৃথক শ্রেণির স্থির পদ্ধতি এবং প্রদত্ত নামের কোনও পদ্ধতি উপস্থিত না থাকলে মেথড কল সিনট্যাক্সটি যথাযথভাবে সংকলক দ্বারা ব্যাখ্যা করা হয় তবে একটি "এক্সটেনশন পদ্ধতি" সংজ্ঞায়িত করা হয়। এটির সুবিধাটি রয়েছে যে ইতিমধ্যে সংকলিত শ্রেণিতে এক্সটেনশন পদ্ধতিগুলি যুক্ত করা যেতে পারে এবং এমন পদ্ধতিগুলি যেমন অনুকূলিত সংস্করণ সরবরাহ করতে পারে না যেমন উদ্বোধন করা যায় না।


কেউ উল্লেখ করতে পারেন যে একাধিক উত্তরাধিকার জাভা 8-এ ইন্টারফেস এক্সটেনশন পদ্ধতিগুলির সাথে প্রবর্তিত হবে।
জর্জিও

@ জর্জিও: না, একাধিক উত্তরাধিকার অবশ্যই জাভাতে প্রবর্তিত হবে না। মিক্সিনগুলি হ'ল এটি খুব আলাদা জিনিস, যদিও এটি একাধিক উত্তরাধিকার ব্যবহারের অনেকগুলি কারণ এবং কৌতূহলীভাবে পুনরাবৃত্তি টেম্পলেট প্যাটার্ন (সিআরটিপি) ব্যবহার করার বেশিরভাগ কারণগুলি জুড়ে এবং বেশিরভাগ সিআরটিপির মতো কাজ করে, একাধিক উত্তরাধিকারের মতো নয়।
জান হুডেক

আমি মনে করি একাধিক উত্তরাধিকার নেই প্রয়োজন, একটি বস্তুর মাঝখানে মধ্যে পয়েন্টার। যদি এটি হয়ে থাকে তবে একাধিক ইন্টারফেস উত্তরাধিকারীরও এটির প্রয়োজন হবে।
সুইভ 10

@ স্পিক: না, তা হয় না। তবে বিকল্পটি অনেক কম দক্ষ কারণ এটি সদস্যের অ্যাক্সেসের জন্য ভার্চুয়াল প্রেরণের প্রয়োজন।
জান হুডেক

আমার চেয়ে অনেক বেশি সম্পূর্ণ উত্তরের জন্য +1।
নাথান সি। ট্রেশেচ

2

উত্তরটি হ'ল নামস্থান সংঘর্ষের ঘটনায় এটি সি ++ তে সঠিকভাবে কাজ করে না। এই দেখুন । নেমস্পেস সংঘর্ষ এড়াতে আপনাকে পয়েন্টার সহ সব ধরণের জিরিশন করতে হবে। আমি এমএসে ভিজ্যুয়াল স্টুডিও টিমে কাজ করেছি এবং আমি কমপক্ষে অংশে কারণ নিয়েছিলাম যে তারা প্রতিনিধিদের বিকাশ করেছিল, পুরোপুরিভাবেই নেমস্পেসের সংঘর্ষ এড়ানো। প্রাকদৃষ্টিতে আমি বলেছিলাম যে তারা ইন্টারফেসগুলি একাধিক উত্তরাধিকার সমাধানের অংশ হিসাবে বিবেচনা করেছিল, তবে আমার ভুল ছিল। ইন্টারফেসগুলি সত্যই আশ্চর্যজনক এবং এটি সি ++, এফডাব্লুআইডাব্লুতে কাজ করা যায়।

প্রতিনিধি দলটি বিশেষত নাম স্থানের সংঘর্ষকে সম্বোধন করে: আপনি ৫ টি শ্রেণিতে প্রতিনিধিত্ব করতে পারেন এবং এর মধ্যে ৫ টিই তাদের পদ্ধতিগুলি প্রথম শ্রেণীর সদস্য হিসাবে আপনার সুযোগে রফতানি করবে। বাইরের দিকে এই একাধিক উত্তরাধিকার সন্ধান করুন।


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

@ ডকব্রাউন আমি এমএস-এ ভিজ্যুয়াল স্টুডিও টিমে কাজ করেছি এবং আমি আপনাকে আশ্বাস দিয়েছি যে তারা কমপক্ষে নামকরণের সংঘর্ষ এড়াতে তাদের পক্ষে প্রতিনিধি দল এবং ইন্টারফেস তৈরি করার কারণের কিছুটা অংশ ছিল। প্রশ্নের মান হিসাবে, মেহ। আপনার ডাউনটোট ব্যবহার করুন, অন্যরা মনে হয় এটি কার্যকর।
নাথান সি। ট্রেশেচ

1
আপনার উত্তরটি হ্রাস করার আমার কোনও উদ্দেশ্য নেই কারণ আমি মনে করি এটি সঠিক উত্তর। তবে আপনার উত্তর ভান করে যে এমআই সি ++ এ সম্পূর্ণ ব্যবহারযোগ্য নয় এবং এ কারণেই তারা এটি সি # তে প্রবর্তন করেনি। যদিও আমি সি ++ তে এমআই খুব বেশি পছন্দ করি না, তবে আমি মনে করি এটি সম্পূর্ণ অপ্রয়োজনীয় নয়।
ডক ব্রাউন

1
এটি অন্যতম কারণ, এবং আমি বোঝাতে চাইনি যে এটি কখনও কাজ করে না। যখন কোনও কিছু কম্পিউটিং-এ অবিচ্ছিন্ন থাকে তখন আমি বলি যে এটি "ভাঙ্গা", বা যখন "আমি ভুডুর মতো, এটি আপনার মোমবাতি জ্বালিয়ে প্রার্থনা করতে পারে" বলতে চাইলে এটি "কাজ করে না" to : ডি
নাথান সি। ট্রেশেচ

1
"নেমস্পেস সংঘর্ষ" অ-নিরস্তাত্মক?
ডক ব্রাউন 14
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.