سؤال

لدي الدرجة الأولى:

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;
}

الأميال الخاص بك قد تختلف ، على الرغم من.

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