আই 3 প্রয়োগকারী যে কোনও কিছুতে আই 1 এবং আই 2 প্রয়োগ করতে হবে এবং আই 3 উত্তরাধিকার সূত্রে বিভিন্ন শ্রেণীর আইটেমগুলি পরস্পরের পরিবর্তে ব্যবহার করা যাবে (নীচে দেখুন), তাই আই 3 খালি কল করা কি ঠিক? যদি তাই হয় তবে এটির চেয়ে ভাল উপায় কী হবে?
"Bundling" I1এবং I2মধ্যে I3অফার একটা চমৎকার (?) শর্টকাট, বা যেখানেই থাকুন না কেন আপনি চান উভয় বাস্তবায়িত হওয়ার জন্য সিনট্যাক্স চিনি কিছু বাছাই।
এই পদ্ধতির সমস্যাটি হ'ল আপনি অন্য বিকাশকারীদের সুস্পষ্টভাবে বাস্তবায়ন I1 এবং I2 পাশাপাশি থাকতে বাধা দিতে পারবেন না , তবে এটি উভয় উপায়েই কাজ করে না - যদিও : I3এর সমতুল্য : I1, I2, এর : I1, I2সমতুল্য নয় : I3। এমনকি যদি তারা কার্যত অভিন্ন হয় তবে এমন একটি শ্রেণি যা উভয়কে সমর্থন করে I1এবং সমর্থন I2হিসাবে সনাক্ত করা যায় না I3।
এর অর্থ হ'ল আপনি একই জিনিসটি সম্পাদন করার দুটি উপায় সরবরাহ করছেন - "ম্যানুয়াল" এবং "মিষ্টি" (আপনার সিনট্যাক্স চিনির সাথে)। এবং এটি কোডের ধারাবাহিকতায় খারাপ প্রভাব ফেলতে পারে। এখানে একই জিনিসটি সম্পাদন করার জন্য 2 টি বিভিন্ন উপায়ে অফার করা হয়েছে এবং অন্য জায়গায় ইতিমধ্যে 8 টি সম্ভাব্য সংমিশ্রণের ফলাফল ইতিমধ্যে :)
void foo() {
I1 something = new A();
something = new B();
something.SomeI1Function();
something.SomeI2Function(); // we can't do this without casting first
}
ঠিক আছে, আপনি পারবেন না। তবে সম্ভবত এটি আসলে একটি ভাল চিহ্ন?
যদি I1এবং I2বিভিন্ন দায়িত্ব বোঝায় (অন্যথায় তাদের প্রথমে পৃথক করার প্রয়োজন হবে না), তবে সম্ভবত একবারে দুটি আলাদা দায়িত্ব পালনের foo()চেষ্টা করা এবং ভুল করা কি ভুল something?
অন্য কথায়, এটি foo()এমনও হতে পারে যে এটি সিঙ্গল দায়বদ্ধতার নীতিটি লঙ্ঘন করে এবং এটিকে ছুঁড়ে ফেলার জন্য এটি ingালাই এবং রানটাইম টাইপ চেকগুলির প্রয়োজন এটি একটি লাল পতাকা এটি সম্পর্কে আমাদেরকে উদ্বেগজনক করে তোলে।
সম্পাদনা করুন:
আপনি যদি fooপ্রয়োগ করে এমন কিছু গ্রহণ করে I1এবং I2এটি পৃথক প্যারামিটার হিসাবে পাস করতে পারে তা নিশ্চিত করার জন্য আপনি যদি জোর করে থাকেন :
void foo(I1 i1, I2 i2)
এবং তারা একই জিনিস হতে পারে:
foo(something, something);
fooতারা একই উদাহরণ বা না থাকলে কী যত্ন করে ?
তবে যদি এটি যত্নশীল হয় (উদাহরণস্বরূপ কারণ তারা রাষ্ট্রহীন নয়), বা আপনি কেবল এটিকে কুৎসিত মনে করেন, তবে এর পরিবর্তে কেউ জেনেরিক ব্যবহার করতে পারে:
void Foo<T>(T something) where T: I1, I2
এখন জেনেরিক সীমাবদ্ধতাগুলি কোনও কিছুর সাথে বাইরের বিশ্বকে দূষিত না করার সময় কাঙ্ক্ষিত প্রভাবের যত্ন নেয়। এটি সংকলন-সময় পরীক্ষার উপর ভিত্তি করে আইডেম্যাটিক সি #, এবং এটি সামগ্রিকভাবে আরও সঠিক অনুভব করে।
আমি I3 : I2, I1কিছুটা এমন ভাষাতে ইউনিয়ন ধরণের অনুকরণ করার প্রয়াস হিসাবে দেখছি যা বাক্সের বাইরে এটি সমর্থন করে না (সি # বা জাভা দেয় না, তবে ইউনিয়নের ধরণগুলি কার্যকরী ভাষায় বিদ্যমান)।
এমন একটি নির্মাণকে অনুকরণ করার চেষ্টা করা যা ভাষার দ্বারা প্রকৃতপক্ষে সমর্থিত হয় না প্রায়শই আঠালো। একইভাবে, সি # তে আপনি মিশ্রণগুলি অনুকরণ করতে চাইলে এক্সটেনশন পদ্ধতি এবং ইন্টারফেস ব্যবহার করতে পারেন । সম্ভব? হ্যাঁ. ভাল ধারণা? আমি নিশ্চিত নই.