ما هي بعض الأمثلة في العالم الحقيقي المجرد الجديدة/الظاهرية/تجاوز/الملخص الكلمات الرئيسية ؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

أنا الانتقال من PHP إلى C#.

في PHP كانت بسيطة ومباشرة إلى استخدام فئات مجردة لإنشاء "المتتالية تجاوز"نمط الأساس "قاعدة الطبقة الطريقة سوف تأخذ الرعاية من ذلك إلا وراثة الطبقة الأسلوب مع نفس التوقيع".

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

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

التعليمات البرمجية التي تعمل:

using System;

namespace TestOverride23433
{
    public class Program
    {
        static void Main(string[] args)
        {
            string[] dataTypeIdCodes = { "line", "wn" };
            for (int index = 0; index < dataTypeIdCodes.Length; index++)
            {
                DataType dataType = DataType.Create(dataTypeIdCodes[index]);
                Console.WriteLine(dataType.GetBuildItemBlock());
            }

            Console.ReadLine();
        }
    }

    public abstract class DataType
    {
        public static DataType Create(string dataTypeIdCode)
        {
            switch (dataTypeIdCode)
            {
                case "line":
                    return new DataTypeLine();
                case "wn":
                    return new DataTypeWholeNumber();
                default:
                    return null;
            }
        }

        //must be defined as virtual
        public virtual string GetBuildItemBlock()
        {
            return "GetBuildItemBlock executed in the default datatype class";
        }
    }

    public class DataTypeLine : DataType
    {
        public DataTypeLine()
        {
            Console.WriteLine("DataTypeLine just created.");
        }
    }

    public class DataTypeWholeNumber : DataType
    {
        public DataTypeWholeNumber()
        {
            Console.WriteLine("DataTypeWholeNumber just created.");
        }

        //new public override string GetBuildItemBlock()  //base method is erroneously executed
        //public override string GetBuildItemBlock() //gets error "cannot override inherited member because it is not marked virtual, abstract, or override"
        public override string GetBuildItemBlock()
        {
            return "GetBuildItemBlock executed in the WHOLENUMBER class.";
        }
    }

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

المحلول

virtual/override هو جوهر تعدد الزوج;يبدو أنك قد تصدع هذه

abstract مثل virtual, ولكن هناك هو لا معقولة قاعدة التنفيذ ؛ حالات الاستخدام:ربما Stream, حيث يتم ضروري من أجل التنفيذ الفعلي أن تفعل شيئا مع بايت.هذا يفرض على الطبقة أن تكون abstract

new عادة ما ينبغي تجنبها ، فإنه يكسر تعدد الأشكال...الحالة الأكثر شيوعا هي إعادة فضح مع أكثر تحديدا التوقيع / عودة من نوع (ربما في مختومة الدرجة, لأنه لا تحصل على أجمل سلسلة...) - انظر SqlConnection.CreateCommand (مقابل DbConnection.CreateCommand) ، أو (ربما لا) IEnumerator<T>.Current (مقابل IEnumerator.Current)

نصائح أخرى

يبدو أنك بالفعل أحسب virtual و override من المثال الخاص بك, لذلك:

  • 'abstract'يمكن أيضا أن تطبق على أعضاء بدلا من 'virtualفي حالة عدم تحديد تنفيذ طريقة ('; مباشرة بعد التوقيع).هذه القوات كل ملموسة أحفاد لتنفيذ الطريقة.

  • 'new'لا علاقة له الميراث ، ولكن يمكن بدلا من ذلك أن تستخدم في سليل الطبقة على الأعضاء لإخفاء الأعضاء في قاعدة الطبقة التي لديها بالضبط نفس التوقيع.

باختصار ;)

وبالإضافة إلى إجابات أخرى.

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

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

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