سؤال

إسمح لي إذا كان هذا هو DUPE، لكنني لم أستطع الحصول على التحرير والسرد المناسب للكلمات الرئيسية لتصفية أسفل أنواع القيود والأجواء المختلفة هناك (كما يوجد الكثير).

لدي واجهتان - دعونا نسميهم أيونلاين و ioffline..

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

ثم لدي بعض الأساليب هناك تعمل ضد المنفذين الخرسانة لهذه الواجهات. في بعض الأحيان تريد هذه الطرق فقط التعامل مع نوع واحد وليس الآخر.

بسيطا بما فيه الكفاية:

public void DoStuff<T>(string foo) where T : IOnline {}

يقوم Kicker بتنفيذ رمز الأساليب التي يمكن أن تعمل على أي من النوع. اعتقدت أن هذا سيكون صحيحا، ولكن في قراءة خطأ الترجمة، توقعاتي أن القيد سيتم تفسيره على أنه "السماح بأي نوع تي استخدامه بشكل عام هنا إذا قاموا بتطبيق الأيوسين أو IOFFLINE"، يتم تفسيره بالفعل على أنه "السماح بأي نوع ل أن تستخدم بشكل عام هنا إذا قاموا بتنفيذ كل من ".

public void DoStuff<T>(string foo) where T : IOnline, IOffline {}

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

أنا يستطع استخدم اسمين مختلفين بطريقتين مختلفتين، ولكل منها قيد المناسبة، ولكن يبدو أن كلودج ويجعل الأشياء الأخرى أن تكون آلام في الحمار ... قابلة للتنفيذ، ولكن ليس مثاليا.

أشعر أنني يجب أن يكون هناك شيء أفتقده هنا ... أشعر بالراحة تماما في الأراضي العامة ولكن هذه هي المرة الأولى التي أجدها على أي وقت مضى لإنجاز ما أنا بعد وأشعر أنني فقط غزل بلدي عجلات الصراف الآلي.

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

المحلول

توريد قيود متعددة كما هو الحال في مثالتك الثانية مضافة بالفعل. ال صفحة MSDN على القيود العامة لديه قليلا عن هذا.

هل يمكنك جعل واجهاتك الثانية ورثا من واجهة أساسية، وقيادة الأساليب إلى نوع الأساس؟

نصائح أخرى

ربما لم يكن هذا إجابة على سؤالك، لكنني أشعر تلقائيا بأنك قد ترغب في إعادة تكوين واجهاتك. من سؤالك:

إنهم يرتبطون ارتباطا وثيقا بأنهم يصفون عقود متطابقة تقريبا، ولكن أحد الاختلافات الرئيسية بينهما هو السياق الذي سيتم فيه استخدام تطبيقات الخرسانة.

وجهة نظري للواجهات هي ذلك هم العقود. وبعد يحددون كيف ينبغي أن شيء ما بحث, ، ليس بالضبط كيف ينبغي تصرف; ؛ هذه هي مهمة التنفيذ. الآن، ليس لدي أي معلومات حول تطبيق التطبيق الخاص بك أو مشكلة المشكلة، لكن ربما سأحاول قضاء بعض الوقت في تحديد الأجزاء المتطابقة من تلك الواجهات ونقلها إلى واجهة واحدة، والحفاظ على الاختلافات فقط كواجهات منفصلة. وبهذه الطريقة، ربما يمكنك التنقل في الماضي هذه الأنواع من القضايا بسهولة أكبر.

أعتقد أن الطريقة القياسية في .NET للقيام بذلك هي أن تحتوي على واجهة واحدة تحتوي على وظائف OONLINE و IOFFLine الخاصة بك، ثم بعض الخصائص التي تقول إن الوظائف التي يتم تنفيذها بالفعل في فئة محددة. ترى هذا النمط في أماكن مختلفة في .NET مع أشياء مثل أسلوب البحث () قد لا يتم تنفيذ أو قد يتم تنفيذ خاصية canseek التي يمكنك اختبارها.

ربما ليس منظف تصميم OO، لكنه يعمل.

يفقد بعض التحقق من وقت الترجمة، لكنني لا أستطيع أن أرى أي طريقة حولها ... عليك أن تختار ما تفضل استخدامه، (أفترض أن تفضيلاتك سيكون عبر الإنترنت):

public void DoStuff<T>(string foo)
{
    Type type = typeof(T);
    if(type.GetInterfaces().Contains(typeof(IOnline)))
         doStuffOnline<T>(foo);
    else if(type.GetInterfaces().Contains(typeof(IOffline)))
         doStuffOffline<T>(foo);
    else
         throw new Exception("T must implement either IOnline or IOffline");
}

private void doStuffOnline<T>(string foo){ // can assume T : IOnline }
private void doStuffOffline<T>(string foo){ // can assume T : IOffline }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top