سؤال

لقد واجهت مؤخرًا مشكلة حيث يبدو أنني بحاجة إلى طريقة "مجردة ثابتة".أعرف سبب استحالة ذلك، ولكن كيف يمكنني التغلب على هذا القيد؟

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

abstract class AbstractBase
{
    ...
    public static abstract string Description{get;}
    ...
}

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

هل يجب أن أجعلها ببساطة غير ثابتة، وأحصل دائمًا على مثيل للحصول على المعلومات الخاصة بهذه الفئة؟

أيه أفكار؟

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

المحلول

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

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

نصائح أخرى

وأنت غير قادر.

والمكان للقيام بذلك مع السمات.

وعلى سبيل المثال

[Name("FooClass")]
class Foo
{
}

إذا كنت لا تمانع في أن تؤجل إلى تطبيقات لتنفيذ معقول خاصية الوصف، يمكنك أن تفعل ببساطة

public abstract string ClassDescription {get; } 
// ClassDescription is more intention-revealing than Description

وتنفيذ الطبقات أن تفعل شيئا من هذا القبيل:

static string classDescription="My Description for this class";
override string  ClassDescription { get { return classDescription; } }

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

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

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

لماذا لا مجرد وسيلة الكلاسيكية؟

abstract class AbstractBase
{
    protected string _Description = "I am boring abstract default value";
}

class Foo : AbstractBase {

     public Foo() {
       _Description = "I am foo!";
     }
}

وانها ليست ثابتة إذا كان لديه ليتم استدعاؤها على سبيل المثال.

إذا كنت لا يدعو ذلك على سبيل المثال، ثم ليس هناك تعدد في اللعب (أي ChildA.Description لا علاقة تماما لChildB.Description بقدر اللغة هي المعنية).

الحل البديل المحتمل هو تحديد Singleton للفئة المشتقة الخاصة بك في الفئة الأساسية الخاصة بك بمساعدة الأدوية العامة.

import System;

public abstract class AbstractBase<T>
    where T : AbstractBase<T>, new()
{
    private static T _instance = new T();

    public abstract string Description { get; }
    public static string GetDescription()
    {
        return _instance.Description;
    }
}

public class DerivedClass : AbstractBase<DerivedClass>
{
    public override string Description => "This is the derived Class";
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(DerivedClass.GetDescription());
        Console.ReadKey();
    }
}

الحيلة هي أن تخبرك AbstractBase<T> بعض التفاصيل حول كيفية DerivedClass تم تنفيذه:

  • إنه جديد مع where T: new() حتى يتمكن من إنشاء مثيل Singleton
  • يستمد من نفسه مع where T : AbstractBase<T> لذلك فهو يعلم أنه سيكون هناك تنفيذ Description

من هنا _instance يحتوي على Description الحقل الذي يمكن استدعاؤه في الطريقة الثابتة GetDescription().هذا يفرض عليك الكتابة الفوقية Descriptionفي الخاص بك DerivedClass ويسمح لك بالاتصال بقيمته DerivedClass.GetDescription()

هل يمكن جعل "مجردة" طريقة قاعدة بطرح Exception، لذلك ثم المطور "حذر" اذا كان يحاول استدعاء هذا الأسلوب على فئة الأطفال دون تجاوز.

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

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