سؤال

هل سيكون هذا ممكنا؟ (ليس لدي مقابل 2010، لذلك لا يمكنني تجربته بنفسي، آسف)

public interface IComplexList<out TOutput, in TInput> where TOutput : TInput
{
    public IEnumerator<TOutput> GetEnumerator();
    public void Add(TInput item);
}

public interface IList<T> : IComplexList<T, T>
{
}

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

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

المحلول

لا، لا يمكنك ذلك. في مثالك IList<T> هو ثابت. IList<T> سيتطلب إعلان in/out أن تكون covarian / متناقض. لا يمكن القيام بذلك فقط من خلال ورث بعض الواجهة التي هي Covariant.

نصائح أخرى

حسنا، سؤالك مربك قليلا بسبب القائمة IList<T> اكتب. ومع ذلك، ما يلي هل ترجمة:

public interface IComplexList<out TOutput, in TInput> where TOutput : TInput
{
    IEnumerator<TOutput> GetEnumerator();
    void Add(TInput item);
}

public interface ISimpleList<T> : IComplexList<T, T>
{
}

يمكنك حتى تغييره لتمديد IEnumerable<TOutput>:

public interface IComplexList<out TOutput, in TInput>
    : IEnumerable<TOutput>
    where TOutput : TInput
{        
    void Add(TInput item);
}

public interface ISimpleList<T> : IComplexList<T, T>
{
}

المفهرس صعب، لأنك تريد أنواع مختلفة من المشاركة. يمكنك القيام به:

TOutput Get(int index);
void Set(int index, TInput item);

ثم ضع المفهرس في ISimpleList<T> بدلا من الدورة ...

هذا لا يسمح لك باستخدام ISimpleList<T> البديل رغم ذلك، لأنك أجبرت في الأساس = toutput = toutput.

نهج بديل هو فصل المدخلات من الإخراج:

public interface IReadableList<out T> : IEnumerable<T>
{
    T Get(int index);
}

public interface IWritableList<in T>
{
    void Add(T item);
    void Set(int index, T item);
}

 public interface IMyList<T> : IReadableList<T>, IWritableList<T> {}

ثم يمكنك الكتابة:

public void Foo(IWritableList<string> x) { ... }

IMyList<object> objects = new MyList<object>();
Foo(objects);

والعكس صحيح ل IReadableList. وبعد بمعنى آخر، تسمح بالتباين لكل جانب على حدة، لكنك لا تحصل أبدا على تباين للجانبين معا.

إذا تم اعتبار تنفيذ خاصية قراءة القراءة أيضا تنفيذ عقار للقراءة فقط، فيمكن للمرء أن يضيف شكل مفيد من قائمة التباين والمكافحة من خلال وجود إيليست (من ر) عن الإيقاع الإيرادي (من T) و IADDABLELIST ( في ر). شريطة أن تضمنت هذه الواجهات ببساطة أعضاء موجودة في إيليست (من ر) قبل تحديدها، فإن المدونة التي تنفذ Ilist (من ر) ستنفذ تلقائيا الأعضاء الآخرين. لسوء الحظ، لأن الإقليم الإيرابي أن يكون covariant، سيكون لديك خاصية مفهرس للقراءة فقط؛ لا يمكن استبدال تنفيذ عقار القراءة في Ilist. إن وجود إيليست (من ر) يرث من الإيرادات الإيرابية القابلة للاستخدام (من ر) من شأنه أن يكسر جميع تطبيقات إيليست (من ر).

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