تجاوزات في VB.NET

click fraud protection

هذه واحدة من سلسلة مصغرة تغطي الاختلافات في التحميل الزائد والظلال والتجاوزات VB.NET. تتناول هذه المقالة تجاوزات. المقالات التي تغطي الآخرين هنا:

-> الزائد
-> الظلال

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

تجاوزات

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

في المقالة حول الفئات والكلمة الأساسية Shadows (راجع: Shadows في VB.NET) ، تمت إضافة دالة لإظهار أنه يمكن الرجوع إلى إجراء موروث.

instagram viewer
الفئة الفنية العامة '... الرمز غير معروض... الوظيفة العامة HashTheName ( ByVal nm كسلسلة) كسلسلة. العودة نانومتر. GetHashCode. وظيفة النهاية. نهاية الفصل الدراسي.

الشفرة التي تنسخ فئة مشتقة من هذه الفئة (CodedProfessionalContact في المثال) يمكنها استدعاء هذه الطريقة لأنها موروثة.

في المثال ، استخدمت VB.NET GetHashCode طريقة للحفاظ على الكود بسيطًا وأعاد ذلك نتيجة غير مجدية إلى حد ما ، القيمة -520086483. لنفترض أنني أردت إرجاع نتيجة مختلفة بدلاً من ذلك ، ولكن ،

-> لا يمكنني تغيير الفئة الأساسية. (ربما كل ما لدي هو كود برمجي من بائع.)

... و ...

-> لا يمكنني تغيير رمز الاتصال (ربما هناك ألف نسخة ولا يمكنني تحديثها.)

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

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

دالة تجاوز العامة العامة GetHashCode باسم عدد صحيح

لذلك يجب أن تكون هذه الكلمة الرئيسية موجودة في المثال الأساسي لدينا أيضًا.

دالة التجاوز العامة HashTheName ( ByVal nm كسلسلة) كسلسلة.

تجاوز الطريقة أصبح الآن بسيطًا مثل تزويد كلمة رئيسية جديدة بكلمة "تجاوزات". يمنحك Visual Studio مرة أخرى بداية تشغيل عن طريق ملء الرمز لك باستخدام ميزة الإكمال التلقائي. عندما تدخل ...


دالة التجاوزات العامة HashTheName (

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

دالة التجاوزات العامة HashTheName ( نانومتر كسلسلة) كسلسلة. إرجاع MyBase. HashTheName (نانومتر) وظيفة النهاية.

ومع ذلك ، في هذه الحالة ، سأستبدل الطريقة بشيء آخر غير ذي فائدة على قدم المساواة فقط لتوضيح كيف يتم ذلك: وظيفة VB.NET التي ستعكس السلسلة.

دالة التجاوزات العامة HashTheName ( نانومتر كسلسلة) كسلسلة. إعادة Microsoft. البصرية الأساسية. StrReverse (نانومتر) وظيفة النهاية.

الآن يحصل رمز الاتصال على نتيجة مختلفة تمامًا. (قارن مع النتيجة في مقال عن الظلال.)


معرف الاتصال: 246. اسم العمل: Villain Defeaters، GmbH. تجزئة اسم العمل: HbmG ، sretaefeD nialliV. 

يمكنك تجاوز الخصائص أيضًا. افترض أنك قررت أنه لن يُسمح بقيم ContactID أكبر من 123 ويجب أن تكون افتراضية إلى 111. يمكنك فقط تجاوز الخاصية وتغييرها عند حفظ الخاصية:

_ContactID الخاص باسم عدد صحيح. Public تجاوزات خاصية ContactID باسم عدد صحيح. احصل على. إرجاع _ContactID. احصل على النهاية. تعيين (قيمة ByVal كعدد صحيح) إذا كانت القيمة> 123 ثم. _ContactID = 111. آخر. _ContactID = القيمة. إنهاء إذا. تعيين نهاية. نهاية الممتلكات.

ثم تحصل على هذه النتيجة عند تمرير قيمة أكبر:


معرف الاتصال: 111. اسم العمل: Damsel Rescuers، LTD. 

بالمناسبة ، في رمز المثال حتى الآن ، يتم مضاعفة القيم الصحيحة في الجديد روتين (راجع المقالة في الظلال) ، لذلك يتم تغيير عدد صحيح من 123 إلى 246 ثم تغييره مرة أخرى إلى 111.

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

نظرًا لأن الإعداد الافتراضي لفئة عامة هو NotOverridable ، فلماذا يجب عليك تحديده؟ إذا جربتها على وظيفة HashTheName في الفئة الأساسية ، فستحصل على خطأ في بناء الجملة ، لكن نص رسالة الخطأ يمنحك فكرة:

لا يمكن تحديد 'NotOverridable' للأساليب التي لا تتجاوز طريقة أخرى.

القيمة الافتراضية للطريقة التي تم تجاوزها هي العكس تمامًا: Overrideable. لذا ، إذا كنت تريد الإيقاف للتوقف عند هذا الحد ، فعليك تحديد NotOverridable على تلك الطريقة. في رمز المثال الخاص بنا:


NotOverridable العامة تجاوزات دالة HashTheName (... 

ثم إذا كانت الفئة CodedProfessionalContact بدورها موروثة ...


فئة عامة NotOverridableEx. يرث CodedProfessionalContact. 

... لا يمكن تجاوز الدالة HashTheName في تلك الفئة. يُطلق على العنصر الذي لا يمكن تجاوزه أحيانًا عنصر مغلق.

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

غالبًا ما يستخدم MustOverride في ما يسمى فئة مجردة. (في C # ، يستخدم الشيء نفسه الكلمة Abstract!) هذه فئة توفر فقط قالبًا ومن المتوقع أن تملأه برمزك الخاص. تقدم Microsoft هذا المثال لأحد الأمثلة:

آلة غسيل فئة MustInherit العامة. جديد () 'رمز لطبقة الصف يذهب هنا. نهاية الفرعية. الغسل الفرعي MustOverride العام. عام MustOverride Sub Rinse (loadSize as Integer) تدور دالة MustOverride العامة (السرعة مثل العدد الصحيح) طالما. نهاية الفصل الدراسي.

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

إذا كنت بحاجة إلى مزيد من الشرح حول الاختلافات بين Overloads و Overrides ، فقد تم تطوير مثال مختلف تمامًا في نصيحة سريعة: Overloads Versus Overrides

يمنحك VB.NET المزيد من التحكم من خلال السماح للفئة الأساسية بطلب فئة مشتقة أو رفضها على وجه التحديد لتجاوز استخدام الكلمات الأساسية MustOverride و NotOverridable في الفئة الأساسية. لكن كلاهما يستخدم في حالات محددة إلى حد ما. أولاً ، غير قابل للإلغاء.

نظرًا لأن الإعداد الافتراضي لفئة عامة هو NotOverridable ، فلماذا يجب عليك تحديده؟ إذا جربتها على وظيفة HashTheName في الفئة الأساسية ، فستحصل على خطأ في بناء الجملة ، لكن نص رسالة الخطأ يمنحك فكرة:

لا يمكن تحديد 'NotOverridable' للأساليب التي لا تتجاوز طريقة أخرى.

القيمة الافتراضية للطريقة التي تم تجاوزها هي العكس تمامًا: Overrideable. لذا ، إذا كنت تريد الإيقاف للتوقف عند هذا الحد ، فعليك تحديد NotOverridable على تلك الطريقة. في رمز المثال الخاص بنا:


NotOverridable العامة تجاوزات دالة HashTheName (... 

ثم إذا كانت الفئة CodedProfessionalContact بدورها موروثة ...


فئة عامة NotOverridableEx. يرث CodedProfessionalContact. 

... لا يمكن تجاوز الدالة HashTheName في تلك الفئة. يُطلق على العنصر الذي لا يمكن تجاوزه أحيانًا عنصر مغلق.

يتمثل جزء أساسي من .NET Foundation في اشتراط تحديد الغرض من كل فئة بشكل صريح لإزالة كل عدم اليقين. هناك مشكلة في لغات OOP السابقة تسمى "الفئة الأساسية الهشة". يحدث هذا عندما قاعدة تضيف الفئة أسلوبًا جديدًا يحمل نفس اسم اسم أسلوب في فئة فرعية ترث من قاعدة صف دراسي. لم يخطط المبرمج الذي يكتب الفئة الفرعية لتجاوز الفئة الأساسية ، ولكن هذا بالضبط ما يحدث على أي حال. من المعروف أن هذا أدى إلى صرخة المبرمج الجريح ، "لم أغير أي شيء ، لكن برنامجي تعطل على أي حال. "إذا كان هناك احتمال أن يتم تحديث فصل دراسي في المستقبل ويخلق هذه المشكلة ، فعلن أنه غير قابل للإلغاء.

غالبًا ما يستخدم MustOverride في ما يسمى فئة مجردة. (في C # ، يستخدم الشيء نفسه الكلمة Abstract!) هذه فئة توفر فقط قالبًا ومن المتوقع أن تملأه برمزك الخاص. تقدم Microsoft هذا المثال لأحد الأمثلة:

آلة غسيل فئة MustInherit العامة. جديد () 'رمز لطبقة الصف يذهب هنا. نهاية الفرعية. الغسل الفرعي MustOverride العام. عام MustOverride Sub Rinse (loadSize as Integer) تدور دالة MustOverride العامة (السرعة مثل العدد الصحيح) طالما. نهاية الفصل الدراسي.

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

إذا كنت بحاجة إلى مزيد من الشرح حول الاختلافات بين Overloads و Overrides ، فقد تم تطوير مثال مختلف تمامًا في نصيحة سريعة: Overloads Versus Overrides

instagram story viewer