عام contraints على الفئات المشتقة
-
04-07-2019 - |
سؤال
لدي الدرجة الأولى:
public class ClassA<T>
فئة B مستمد من:
public class ClassB : ClassA<ClassB>
الفئة C مستمد من فئة B:
public class ClassC : ClassB
الآن لدي طريقة عامة مع القيود
public static T Method<T>() where T : ClassA<T>
حسنا, الآن أريد أن أدعو:
ClassC c = Method<ClassC>();
ولكن يمكنني الحصول على خطأ ترجمة قائلا:Type argument 'ClassC' does not inherit from or implement the constraint type 'ClassA<ClassC>.
ومع ذلك ، فإن المترجم تسمح:
ClassB b = Method<ClassB>();
ما أفهمه هو أن هذا فشل بسبب ClassC
يرث ClassA<ClassB>
بدلا من ClassA<ClassC>
بلدي السؤال الحقيقي هو: هل من الممكن إنشاء فئة الناشئة من ClassB
التي يمكن استخدامها في بعض الطريق مع عامة الأسلوب ؟
قد يبدو هذا مثل الأدوية يبالغ وأود أن نتفق.أنا أحاول خلق طبقة رجال الأعمال الكائنات المستمدة من دون سرعة الصوت كائنات بيانات في مشروع منفصل.
ملاحظة:لقد وضعت < T > مع مساحات إضافية وإلا فإنها تحصل على تجريده من السؤال.
المحلول
حسنا, يمكنك تغيير طريقة:
public static T Method<T,U>() where T : ClassA<U> where U : T
لا تساعد على الإطلاق ؟ إنها لا تستخدم كثيرا إذا كنت لا تستطيع تغيير الطريقة بالطبع...
نصائح أخرى
لا.يجب تغيير أو إنهاء هذا الأسلوب.
هنا هو السبب.
ClassC يرث من ClassB الذي يرث من ClassA(ClassB)
ClassC لا يرث من ClassA(ClassC)
أي طفل من ClassB سوف ترث من ClassA(الطفل فئة) ، لأنها بدلا ترث من ClassB و ClassB لا يرث من ClassA(الطفل الطبقة).
في معظم الحالات من الممكن حل هذا السيناريو من خلال وجود قاعدة غير عامة خلاصة الدرجة:
public abstract class BasicClassA
{
}
public class ClassA<T> : BasicClassA
{
}
public class ClassB : ClassA<ClassB>
{
}
public class ClassC : ClassB
{
}
public static T Method<T>() where T : BasicClassA
{
return null;
}
الأميال الخاص بك قد تختلف ، على الرغم من.