ما هو / نهج بديهية نظيفة لتوسيع فئة مغلقة في .NET Framework 1.1؟

StackOverflow https://stackoverflow.com/questions/1046405

سؤال

وأنا في عملية يصمم مكتبة التي سيتم استخدامها في الإصدارات المتعددة للمنتج، وجزء من وظيفتها هو زيادة بعض الوظائف التي لا وجود لها في .NET Framework 1.1، منذ نحن اللازمة لاستخدامها. ولعل أفضل مثال على ذلك هو الأسلوب String.IsNullOrEmpty، التي نعتمد عليها بشكل كبير إلى حد ما وظيفة.

وختم الفئة سلسلة في. NET. لقد فكرت باستخدام محول أو أنماط ديكور لتوسيع وظائف من فئة التفاف السلسلة الأصلية، لكنني لست مقتنعا بأن هذا هو نهج بديهية جدا لما أحاول القيام به. لقد بحثت أيضا في <لأ href = "https://stackoverflow.com/questions/657503/how-to-handle-a-class-you-want-to-extend-which-is-sealed-in-the الصافي مكتبة "> وظيفة أخرى على ستاكوفيرفلوو عن سؤال مماثل، لكنه يطرح من جديد مسألة ذكرتها للتو.

وأنا بالتأكيد يمكن استخدام محول لخلق وظائف وأنا أبحث عنه، ولكن لا أستطيع أن أتخيل أفعل هذا من أجل كل سلسلة:

bool isEmpty = new StringExtensionAdapter(myXmlNode.SelectSingleNode(myXpathString)).IsNullOrEmpty();
if (isEmpty)
{
    // Do something
}

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

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

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

المحلول

وأود أن تفضل "StringUtility" مكتبة مع طريقة IsNullOrEmpty ثابت شخصيا. في جوهرها سيكون لكم خلق دون بناء الجملة لطيف للدعوة معهم.

نصائح أخرى

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

وأنا أتفق مع ماثيو أنه لا يوجد نهج نظيفة. نمط ديكور لا ينطبق، نظرا لأنه يعتمد على الميراث (أو، على الأقل، تعدد الأشكال)، وأنت لا تستطيع تزيين System.String، لأنك لا تستطيع إنشاء فئة لديها نفس واجهة (نظرا لأنه مختوم).

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

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

ويمكنك استخدام عامل ضمني لجعل الأمور أكثر "طبيعية":

public class SuperString
{
    public SuperString(string s) { S = s; }

    public static implicit operator SuperString(string s)
    {
        return new SuperString(s);
    }

    public string S { get; private set; }

    public bool IsNot() { return String.IsNullOrEmpty(S); }
}

[TestMethod]
public void Test_SuperString()
{
    SuperString ss = "wee";
    SuperString xx = "";
    if (xx.IsNot()) ss = "moo";
    System.Console.WriteLine(ss.S);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top