সি # জেনেরিক "কোন জেনেরিক ধরণের" সংজ্ঞা সহ "সীমাবদ্ধতা"?


113

আমাকে উদাহরণ দিতে দাও:

  1. আমার কিছু জেনেরিক ক্লাস / ইন্টারফেস সংজ্ঞা রয়েছে:

    interface IGenericCar< T > {...}

  2. আমার আরও একটি ক্লাস / ইন্টারফেস রয়েছে যা আমি উপরের ক্লাসের সাথে সম্পর্কিত করতে চাই, উদাহরণস্বরূপ:

    interface IGarrage< TCar > : where TCar: IGenericCar< (**any type here**) > {...}

মূলত, আমি আমার জেনেরিক IGarrage উপর নির্ভরশীল হতে চান IGenericCar, নির্বিশেষে এটা যদি IGenericCar<int>বা IGenericCar<System.Color>, কারণ আমি যে ধরনের কোনো নির্ভরতা হবে না।

উত্তর:


142

এটি অর্জনের জন্য সাধারণত 2 টি উপায় রয়েছে।

অপশন 1 : প্রতিবন্ধকতার মধ্যে প্রবেশ করতে হবে যা IGarrageউপস্থাপন করতে অন্য একটি পরামিতি যুক্ত করুন :TIGenericCar<T>

interface IGarrage<TCar,TOther> where TCar : IGenericCar<TOther> { ... }

অপশন 2 : একটি বেস ইন্টারফেসটি সংজ্ঞায়িত করুন IGenericCar<T>যার জন্য জেনেরিক নয় এবং সেই ইন্টারফেসের বিরুদ্ধে সীমাবদ্ধ নয়

interface IGenericCar { ... }
interface IGenericCar<T> : IGenericCar { ... }
interface IGarrage<TCar> where TCar : IGenericCar { ... }

6
ঠিক আছে, তবে আমার জেনেরিক ধরণের Tভিতরে থাকা প্রয়োজন হলে আমার কী করা উচিত IGarage<TCar>? অপশন 2 তে আমি কোনও সম্ভাবনা দেখতে পাচ্ছি না। IGarage<TCar>প্রকার Tবিশ্লেষণ করে টাইপ পাওয়া গেলে সবচেয়ে ভাল সমাধান হবে TCar
pt12lol

2
উত্তরোত্তর জন্য, এমন একটি ধরণের সিএন তৈরি করা যেতে পারে যা কাঁচা জেনেরিক ধরণের ধরণের প্যারামিটার থাকে তবে কেবল রানটাইমের সময় প্রতিবিম্ব সহ এবং তৈরি শ্রেণিটি কখনই নির্মাণ করা যায়নি, কারণ কাঁচা জেনেরিক ধরণের পরামিতি সম্পূর্ণ সংজ্ঞা ছাড়াই স্বয়ংক্রিয়ভাবে নির্মিত হতে পারে না আইটিএস সম্পর্কিত ধরণের পরামিতি। আমি দেখতে পাচ্ছি না যেখানে এটি কার্যকর হতে পারে, কেবলমাত্র বাইরের সবচেয়ে ক্লাসের সুপার জেনেরিক স্থিতিশীল সদস্যদের (যেমন IGarage<IGenericCar<?>>.TellMeAboutCarsInGeneral(), সম্ভবত এটি খারাপ নকশার ফলস্বরূপ) হতে পারে, তবে আমি আমার টিঙ্কিংয়ে এটি করেছি এবং এটি সম্ভব.
মাইকেল হফম্যান

আমি ধরে নিলাম যে কেউ আইজেনেরিকিকার ইন্টারফেসটি একটি শ্রেণিতে যুক্ত করতে পারে এবং একটি অপ্রত্যাশিত শ্রেণীর সাথে সীমাবদ্ধ পদ্ধতিটি ভেঙে দিতে পারে।
এন-এট

2
@ পিটি 12লল: যদি IGarrage<TCar>প্রকৃতপক্ষে অন্তর্নিহিত জেনেরিক প্রকারটি পরিচালনা করে (যেমন এটি উল্লিখিত ধরণের কোনও সম্পত্তি পরিচালনা করে) তবে তার প্রকারটি জানতে হবে, যার জন্য আপনাকে প্রকারটি নির্দিষ্ট করতে হবে, যা বিকল্প 1 (তখন একমাত্র কার্যকর বিকল্প)। তবে, যদি IGarrage<TCar>সরাসরি অন্তর্নিহিত জেনেরিক প্রকারটি হ্যান্ডেল না করে (সমস্ত IGarrage<TCar>কোড এই অন্তর্নিহিত ধরণের অজ্ঞেয়াদি), তবে বিকল্প 2 বৈধ।
ফ্ল্যাটার

6

এর মতো কিছু করার অর্থ কি তা বোঝাতে পারে:

interface IGenericCar< T > {...}
interface IGarrage< TCar, TCarType > 
    where TCar: IGenericCar< TCarType > {...}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.