سؤال

أرى مثل هذه الاشياء الكثير:

interface A { ... }
interface B : A { ... }
class C : B, A { ...}

لماذا قمت بتحديد أن ج تنفذ واجهة A, B عندما بالفعل يرث ؟ فإنه لا تجعل أي الفرق الدلالي أو هو مجرد مسألة النمط ؟

(واحدة من العديد من الأمثلة List<T> تنفيذ IList<T> و ICollection<T>, في حين IList<T> أيضا مستمد من ICollection<T>).


تحديث: شكرا على تأكيد أعتقد أنه لا يجعل من أي الفرق الدلالي.

وقد تأتي مع الوضع حيث لا فرقا صراحة اسم واجهة التي هي بالفعل في الميراث شجرة:

إذا B كانت فئة ، C فقط (إعادة)تنفيذ واجهة أعضاء من A إذا كان من أسماء A صراحة بعد ':'.

[تحرير] لقد غيرت صيغة السؤال لتفادي الخلط مع صراحة تنفيذ واجهة أعضاء ، والتي تقيد استخدام العضو في الحالات التي يكون فيها الكائن يلقي واجهة.

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

المحلول

وأعتقد أن هذا هو مجرد مسألة من النمط.هذا أهمية خاصة عند النظر في الإطار/مكتبة دروس - في المثال الخاص بك ، على سبيل المثال ، فإنه يسلط الضوء على فكرة أن هذه الفئة يمكن أن تعامل على أنها إما ICollection أو IList دون المطور الحاجة إلى معرفة أن IList هو في الواقع ICollection.

فإنه لا يوجد لديه وظيفية تداعيات.على وجه التحديد, هذه المدونة تجمع ما إذا كان أو لا فئة 'ج' الأدوات 'A' صراحة:

namespace DotNetInterfaceTest {
    class Program {
        static void Main(string[] args) {
            A c = new C();
        }
    }

    interface A {
        void foo();
    }

    interface B : A {
        void bar();
    }

    class C : B {
        public void bar() {}
        public void foo() {}
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top