تجنب التنفيذ الافتراضي في واجهة C#


أبحث عن طريقة لدمج وظائف إضافية في فئات مختلفة في C#. كان التركيز على التنفيذ الافتراضي لطرق الواجهة فكرة جيدة.

النظر في هيكل الفئة التالية:

تعتبر الفئة A أساسًا للفئات B وC وD.
تعتبر الفئة E أساسًا للفئات F وG وH.
تعتبر الفئة O أساسًا للفئات P وQ وR.

ومن بين هذه الفئات، يجب أن تقوم الفئات B وF وP بتنفيذ الواجهة IDoable، والذي يتضمن طريقة X يجب أن تكون متسقة عبر جميع فئات التنفيذ.

إليك مثال مبسط:

ج #
public class A
{ }

public class B : A, IDoable
{ }

public class C : A
{ }

public class D : A
{ }

public class E
{ }

public class F : E, IDoable
{ }

public class G : E
{ }

public class H : E
{ }

public class O
{ }

public class P : O, IDoable
{ }

public class Q : O
{ }

public class R : O
{ }

public interface IDoable
{
    // Yuck, that smells. Default implementation.
    string X() => "I want to implement method X only once";
}

public class Test
{
    public void Run()
    {
        string bx = new B().X();
        string fx = new F().X();
        string px = new P().X();
        
        string result = bx == fx && bx == px ? "Same :)" : "Various :("; 
    }
}

ومع ذلك، هناك جدل حول ما إذا كان من المستحسن استخدام التطبيقات الافتراضية لطرق الواجهة في لغة C#. هل هناك طرق بديلة لتحقيق هذه الوظيفة دون الاعتماد على التطبيقات الافتراضية؟ أو هل استخدام التطبيقات الافتراضية مقبول في هذا السيناريو؟

ملحوظة: A وE وO ليس لها خصائص مشتركة وليست مرتبطة.

ما حاولت:

أولاً، امتنعت عن تنفيذ X مباشرة في الفئات B وF وP لتجنب انتهاك جاف مبدأ. ونظرًا لأن X من المفترض أن تكون متطابقة عبر هذه الفئات، فقد بدا هذا النهج غير عملي، خاصة إذا كانت X طويلة.

ثانيًا، قمت بإنشاء طريقة ملحقة، والتي عملت بشكل جيد لتوفير وظيفة X:

ج #
public static class DoableExtensions
{
    public static string X(this IDoable doable)
    {
        return "I want to implement method X only once";
    }
}

ومع ذلك، أدى هذا النهج إلى فارغة IDoable واجهة، وهو ما ينتهك “CA1040: تجنب الواجهات الفارغة” قاعدة.

أخيرًا، فكرت في نمط الديكور، لكنني غير متأكد من كيفية تنفيذ ذلك بكفاءة مع الحفاظ على الالتزام بمبدأ DRY. ولكن من الممكن أن يكون هذا النهج هو الحل الرئيسي.

الحل 1

إن إبقاء السؤال نظريًا يجعل من الصعب جدًا تقديم إجابة محددة دون معرفة الموقف. يبدو أن معلمك، أو الشخص الذي يجري المقابلة معك للحصول على وظيفة، يحاول أن يطرح عليك سؤالاً بدون إجابة واحدة صحيحة ليرى كيف ستكون إجابتك.

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

コメント

タイトルとURLをコピーしました