سؤال

أعجبني النقاش في الاختلافات في الأدوية العامة, وكنت أتساءل عما إذا كانت هناك أي لغات تستخدم هذه الميزة بشكل جيد.

أنا حقا لا أحب جافا List<? extends Foo> ل List من الأشياء التي يمكن استبدال ليسكوف بها Foo.لماذا لا أستطيع List<Foo> تغطية ذلك؟

وبصراحة، Comparable<? super Bar>?

لا أستطيع أيضًا أن أتذكر طوال حياتي سبب عدم إرجاع مجموعة من الأدوية الجنيسة أبدًا:

public T[] getAll<T>() { ... }

لم أحب أبدًا القوالب في C++، ولكن كان ذلك في الغالب بسبب عدم تمكن أي من المترجمين من إرسال رسالة خطأ ذات معنى عن بعد لهم.مرة واحدة فعلت فعلا make realclean && make 17 مرة للحصول على شيء لتجميعه؛لم أفهم أبدًا سبب سحر المرة السابعة عشرة.

إذن من في الواقع الإعجابات باستخدام الأدوية الجنيسة في لغتهم الأليفة؟

هل كانت مفيدة؟

المحلول

تطبق هاسكل معلمات مُنشئ النوع (الأدوية العامة، أو تعدد الأشكال البارامترية) بشكل جيد.وكذلك يفعل Scala (على الرغم من أنه يحتاج إلى القليل من الإمساك باليد في بعض الأحيان).

كلتا هاتين اللغتين لهما أنواع من النوع الأعلى (ويعرف أيضًا باسم.منشئو النوع المجرد، أو تعدد الأشكال منشئ النوع، أو تعدد الأشكال ذو الترتيب الأعلى).

انظر هنا: الجينات من النوع الأعلى

نصائح أخرى

أعتقد أن الأدوية العامة في Java جيدة جدًا بالفعل.السبب List<Foo> يختلف عن List<? extends Foo> هل هذا عندما Foo هو نوع فرعي من Bar, List<Foo> ليس نوعًا فرعيًا من List<Bar>.إذا كنت تستطيع علاج أ List<Foo> كائن ك List<Bar>, ، ثم يمكنك الإضافة Bar يعترض عليه، والتي يمكن أن كسر الأشياء.أي نظام نوع معقول سيتطلب ذلك.تتيح لك Java الإفلات من العلاج Foo[] كنوع فرعي من Bar[], ، ولكن هذا يفرض إجراء فحوصات وقت التشغيل، مما يقلل الأداء.عندما تقوم بإرجاع مثل هذا المصفوفة، فإن ذلك يجعل من الصعب على المترجم معرفة ما إذا كان يجب إجراء فحص وقت التشغيل.

لم أحتاج مطلقًا إلى استخدام الحدود الدنيا (List<? super Foo>)، ولكنني أتصور أنها قد تكون مفيدة لإرجاع القيم العامة.يرى التغاير والتباين.

على العموم، أنا أتفق بالتأكيد مع الشكاوى المتعلقة ببناء الجملة بشكل مفرط ورسائل الخطأ المربكة.من المحتمل أن تسهل عليك اللغات التي تستخدم استنتاج الكتابة مثل OCaml وHaskell، على الرغم من أن رسائل الخطأ الخاصة بها قد تكون مربكة أيضًا.

تبا، اللغة الإنجليزية لا تطبق حتى الأدوية العامة بشكل جيد.:)

إنحيازي هو لـ C#.ويرجع ذلك أساسًا إلى أن هذا هو ما أستخدمه حاليًا وقد استخدمته لتحقيق تأثير جيد.

سأضيف OCaml إلى القائمة، وهو ما حدث بالفعل نوعي الأدوية العامة.أوافق على أن فئات الكتابة الخاصة بـ Haskell تم تنفيذها بشكل جيد حقًا، ولكن الأمر مختلف بعض الشيء حيث أن Haskell لا تحتوي على دلالات OO، لكن OCaml يدعم OO.

أنا أستخدم ‎.Net (VB.Net)، ولم أواجه أي مشاكل في استخدام الأدوية العامة.انها غير مؤلمة في الغالب.

Dim Cars as List(Of Car)
Dim Car as Car

For Each Car in Cars
...
Next

لم أواجه أي مشاكل في استخدام المجموعات العامة، على الرغم من أنني لم أذهب إلى أبعد من ذلك لتصميم أي كائنات تستخدم الأدوية العامة بمفردي.

أعتقد أن C# وVB.NET يقومان بعمل جيد مع الأدوية الجنيسة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top