হান্সের উত্তরের আলোকে নতুন উত্তর
হান্সের দেওয়া উত্তরের জন্য ধন্যবাদ, আমরা দেখতে পাচ্ছি বাস্তবায়ন কিছুটা জটিল, যা আমরা ভাবি। সংকলক এবং সিএলআর উভয়ই খুব সহজে চেষ্টা করে যে কোনও অ্যারে টাইপ প্রয়োগ করে IList<T>
- তবে অ্যারে বৈকল্পিক এই কৌশলটিকে আরও জটিল করে তোলে। হান্সের উত্তরের বিপরীতে, অ্যারের প্রকারগুলি (একক মাত্রিক, যাইহোক শূন্য-ভিত্তিক) জেনেরিক সংগ্রহগুলি সরাসরি বাস্তবায়িত করে, কারণ কোনও নির্দিষ্ট অ্যারের প্রকারটি নয় System.Array
- এটি অ্যারের কেবলমাত্র বেস টাইপ। আপনি যদি কোনও অ্যারের প্রকারটি জিজ্ঞাসা করেন তবে এটি কোন ইন্টারফেস সমর্থন করে, এতে জেনেরিক প্রকারগুলি অন্তর্ভুক্ত রয়েছে:
foreach (var type in typeof(int[]).GetInterfaces())
{
Console.WriteLine(type);
}
আউটপুট:
System.ICloneable
System.Collections.IList
System.Collections.ICollection
System.Collections.IEnumerable
System.Collections.IStructuralComparable
System.Collections.IStructuralEquatable
System.Collections.Generic.IList`1[System.Int32]
System.Collections.Generic.ICollection`1[System.Int32]
System.Collections.Generic.IEnumerable`1[System.Int32]
একক মাত্রিক, শূন্য-ভিত্তিক অ্যারেগুলির জন্য, যতদূর ভাষা সম্পর্কিত, অ্যারে সত্যিই IList<T>
খুব কার্যকর করে। সি # স্পেসিফিকেশনের বিভাগ 12.1.2 তাই বলে। সুতরাং অন্তর্নিহিত বাস্তবায়ন যাই ঘটুক না কেন, ভাষাটিকে এমন আচরণ করতে হবে যেন অন্য কোনও ইন্টারফেসের মতো T[]
প্রয়োগের ধরণ IList<T>
। এই দৃষ্টিকোণ থেকে, ইন্টারফেস হয় সদস্যদের কিছু স্পষ্টভাবে (যেমন বাস্তবায়িত হচ্ছে বাস্তবায়িত Count
)। যা চলছে তার জন্য ভাষা স্তরের এটিই সেরা ব্যাখ্যা ।
দ্রষ্টব্য যে এটি কেবল একক-মাত্রিক অ্যারেগুলিকে ধারণ করে (এবং শূন্য-ভিত্তিক অ্যারে, কোনও ভাষা হিসাবে সি # নন-শূন্য-ভিত্তিক অ্যারে সম্পর্কে কিছু বলেন না)। T[,]
নেই বাস্তবায়ন IList<T>
।
সিএলআর দৃষ্টিকোণ থেকে, মজার কিছু চলছে। জেনেরিক ইন্টারফেস ধরণের জন্য আপনি ইন্টারফেস ম্যাপিংটি পেতে পারেন না। উদাহরণ স্বরূপ:
typeof(int[]).GetInterfaceMap(typeof(ICollection<int>))
এর ব্যতিক্রম দেয়:
Unhandled Exception: System.ArgumentException: Interface maps for generic
interfaces on arrays cannot be retrived.
তাহলে অদ্ভুততা কেন? ঠিক আছে, আমি বিশ্বাস করি এটি সত্যই অ্যারে কোভারিয়েন্সের কারণে, যা টাইপ সিস্টেমের একটি ওয়ার্ট, আইএমও। যদিও IList<T>
হয় না (এবং নিরাপদে থাকতে পারে না) covariant, এরে সহভেদাংক কাজ করার জন্য এই অনুমতি দেয়:
string[] strings = { "a", "b", "c" };
IList<object> objects = strings;
... যা করে তোলে চেহারা মত typeof(string[])
কার্যকরী IList<object>
, যখন এটি সত্যিই না।
সিটিআই স্পেস (ইসিএমএ -৩৩৫) পার্টিশন ১, বিভাগ ৮.7.১ এ রয়েছে:
স্বাক্ষর প্রকারের টি স্বাক্ষর টাইপ ইউ এর সাথে সামঞ্জস্যপূর্ণ এবং কেবল নীচে অন্তত একটি হোল্ড থাকলে
...
টি হ'ল শূন্য-ভিত্তিক র্যাঙ্ক -১ অ্যারে V[]
, এবং U
হয় IList<W>
এবং ভি হ'ল অ্যারে-উপাদান-সামঞ্জস্যপূর্ণ-ডাব্লু এর সাথে is
(এটি আসলে উল্লেখ করে না ICollection<W>
বা IEnumerable<W>
আমি বিশ্বাস করি যা অনুমানের মধ্যে একটি বাগ is)
ভিন্নতা না পাওয়ার জন্য, সিএলআই স্পেকটি সরাসরি ভাষার বর্ণের সাথে চলে। বিভাগ 1 এর 8.9.1 বিভাগ থেকে:
অতিরিক্তভাবে, উপাদান টাইপ টি সহ একটি তৈরি ভেক্টর ইন্টারফেসটি প্রয়োগ করে System.Collections.Generic.IList<U>
, যেখানে ইউ: = টি (§8.7)
(একটি ভেক্টর একটি শূন্য বেস সহ একটি মাত্রিক অ্যারে।
এখন বাস্তবায়নের বিশদগুলির ক্ষেত্রে , স্পষ্টতই সিএলআর এখানে অ্যাসাইনমেন্টের সামঞ্জস্যতা রাখতে কিছু মজাদার ম্যাপিং করছে: যখন কোনও string[]
বাস্তবায়নের জন্য জিজ্ঞাসা করা হয় ICollection<object>.Count
, তখন এটি পুরোপুরি স্বাভাবিকভাবে পরিচালনা করতে পারে না । এই গণনা সুস্পষ্ট ইন্টারফেস বাস্তবায়ন হিসাবে গণ্য করা হয়? আমি মনে করি এটির সাথে সেভাবে আচরণ করা যুক্তিসঙ্গত, যতক্ষণ না আপনি সরাসরি ইন্টারফেস ম্যাপিংয়ের জন্য জিজ্ঞাসা করেন, এটি সর্বদা ভাষার দৃষ্টিকোণ থেকে সেভাবে আচরণ করে ।
কি হবে ICollection.Count
?
এখনও অবধি আমি জেনেরিক ইন্টারফেস সম্পর্কে কথা বলেছি, তবে ICollection
তার Count
সম্পত্তি সহ নন-জেনেরিক রয়েছে । এবার আমরা ইন্টারফেস ম্যাপিংটি পেতে পারি এবং বাস্তবে ইন্টারফেসটি সরাসরি দ্বারা প্রয়োগ করা হয় System.Array
। ICollection.Count
সম্পত্তি প্রয়োগের জন্য ডকুমেন্টেশন Array
সূচিত করে যে এটি সুস্পষ্ট ইন্টারফেস প্রয়োগের মাধ্যমে প্রয়োগ করা হয়েছে।
যদি কেউ এমন কোনও উপায় নিয়ে ভাবতে পারেন যেখানে এই ধরণের সুস্পষ্ট ইন্টারফেস বাস্তবায়ন "সাধারণ" স্পষ্ট ইন্টারফেস প্রয়োগের থেকে পৃথক হয় তবে আমি এটি আরও খতিয়ে দেখে খুশি হব।
সুস্পষ্ট ইন্টারফেস বাস্তবায়ন প্রায় পুরানো উত্তর
উপরের সত্ত্বেও, যা অ্যারে সম্পর্কিত জ্ঞানের কারণে আরও জটিল, আপনি এখনও স্পষ্টত ইন্টারফেস প্রয়োগের মাধ্যমে একই দৃশ্যমান প্রভাবগুলির সাথে কিছু করতে পারেন ।
এখানে একটি সাধারণ স্ট্যান্ডেলোন উদাহরণ:
public interface IFoo
{
void M1();
void M2();
}
public class Foo : IFoo
{
void IFoo.M1() {}
public void M2() {}
}
class Test
{
static void Main()
{
Foo foo = new Foo();
foo.M1();
foo.M2();
IFoo ifoo = foo;
ifoo.M1();
ifoo.M2();
}
}
Array
ক্লাসটি সি # তে লিখতে হবে!