مشكلة مع واجهات
سؤال
لدي واجهة (نسميها على أنها imessage) التي لديها طريقة check () ، فئة تنفذ هذه الواجهة
interface IMessage
{
bool Check();
}
class NewClass : IMessage
{
#region IMessage Members
public bool Check()
{
//Some logic
}
}
هذا جيد. المشكلة هي أنني لا أريد أن تكون هذه الطريقة (check ()) علنية ، أريد أن أبقيها داخليًا للتجميع ، لكن إذا جعلتها داخلية ، فإن المترجم يقول أنه لا ينفذ الواجهة. يجب أن تكون علنية لتنفيذ الواجهة. ماذا يمكنني أن أفعل؟
المحلول
يمكنك تنفيذ طريقة واجهة دون جعله جزءًا من الواجهة العامة المباشرة للفئة باستخدام بناء جملة تنفيذ الواجهة الصريحة ( إزالة مؤهل الوصول والبادئة اسم الواجهة إلى الطريقة ):
interface IMessage
{
bool Check();
}
class NewClass : IMessage
{
bool IMessage.Check() { }
}
ومع ذلك ، أي شخص يمكن أن يلقي إلى IMessage
لا يزال بإمكان الواجهة استدعاء Check (). هذه ليست وسيلة لمنع الدعوة إلى الطريقة - فقط لإرهاق الواجهة العامة للفئة. إذا كانت الواجهة داخلية لتجميعك ، فعندئذ فقط يمكن أن يلقي الفصول الدراسية في هذا التجمع واتصال بالطريقة.
بشكل عام ، لا توفر .NET طريقة لجعل طريقة معينة فقط للواجهة داخلية لتنفيذ الواجهة. هذا هو أحد المجالات التي قد ترغب في التفكير فيها في فئة أساسية مجردة - يمكنك إنشاء أساليب مجردة محمية يمكن أن تنفذها دون تعريضها للمتصلين الخارجيين. علي سبيل المثال:
abstract class MessageBase
{
protected abstract bool Check();
}
class NewClass : MessageBase
{
protected override bool Check() { ... }
}
نصائح أخرى
الواجهات تدور حول كيفية توزيع الكائنات الأخرى مع هذا النوع من الكائن ، بطريقة عامة. إذا كان لا ينبغي للفصول الأخرى الوصول إلى Check()
الطريقة ، إذن لا ينبغي أن يكون جزءًا من الواجهة.
ها هو مناقشة MSDN من هذا الموضوع الذي قد يكون مفيدًا.
class NewClass : IMessage
{
#region IMessage Members
internal bool Check()
{
//Some logic
}
bool IMessage.Check()
{
return this.Check();
}
}
يوفر هذا تنفيذًا داخليًا ، متاحًا فقط للفصول داخل هذه التجميع ، بالإضافة إلى تنفيذ الواجهة الصريحة يتيح لك ذلك تلبية متطلبات الواجهة. للحصول على رمز من مجموعة خارجية للاتصال بـ Check
الطريقة ، سوف تتطلب IMessage
الإشارة إلى فصلك ، وليس أ NewClass
المرجعي.
بدلاً من ذلك ، يمكنك استخدام طريقة مجردة في فئة قاعدة:
public abstract class Message
{
internal abstract bool Check();
}
public class MyMessage : Message
{
internal override bool Check()
{
// do stuff
}
}