تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[نقاش] معلومة لطيفة : كيف يتم تحديد الاجراء الذي يتم استدعائة من ال Overloads
#1
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

من باب العلم بالشيء اذا كان هناك اكثر من اجراء يحمل نفس الاسم Overloads ونفس المدخلات ، هل تسائلت كيف يتم تحديد الاجراء الذي يتم استدعائة ؟

الامر بغاية البساطة ، يختار حسب نوع البيانات المدخل له ، لكن تخيل انك ادخلت نوع بيانات ليس باي overload ولكنه قابل للتحويل الي اي من مدخلات Overloads كأن تدخل رقما Integer والاجرائات بها نوع byte و short و long ، ماذا يحدث عندها 

المثال التالي يشرح الموضوع بصورة جميلة جدا :

https://stackoverflow.com/questions/1645...0#16459680

كود :
using System;

class Program {
   static void Main(string[] args) {
       Foo.Bar(0);
       Console.ReadLine();
   }
}

class Foo {
   public static void Bar(byte arg)  { Console.WriteLine("byte overload"); }
   public static void Bar(short arg) { Console.WriteLine("short overload"); }
   public static void Bar(long arg)  { Console.WriteLine("long overload"); }
}

لدينا كلاس بسيط به 3 اجرائات بنفس الاسم overloads ولهم نفس المدخل arg من 3 انواع byte وshort و long 

كل ما تقوم به الاجرائات هو طباعة ان هذا الاجراء الذي يقبل النوع التالي تم استدعاءه

في ال Main نقوم باستدعاء الاجراء Bar ونرسل له اي قيمة صحيحة ، 0 مثلا ، نجد ان النتيجة : byte overload

اي ان الاجراء صاحب المدخل byte تم استدعاءه ، لماذا حدث ذلك ؟

احد المعلقين على البوست يشرح السبب :
إقتباس :
The reasoning is: a constant integer is implicitly convertible to any integral type that it will fit into, therefore all three methods are applicable. We must now determine which of the three applicable methods is best. It is the one with the most specific parameter type. Type X is more specific than type Y if it is true that "all X can be converted to Y but not all Y can be converted to X". That is, Giraffe is more specific than Animal because all Giraffes are Animals but not vice versa. byte is more specific than either short or long, so it wins. – Eric Lippert May 26 '14 at 0:18 

اي قيمة ثابتة من نوع Integer مثل ال 0 في حالتنا ، هو قابل للتحويل لاي نوع عدد صحيح مناسب له ( short , byte , long ) وبالتالي الان ال 3 اجرائات مناسبين للقيمة المدخلة ، كيف نقوم بتحديد اي اجراء سيتم استدعائه ؟ انه الاجراء الذي يكون مدخله اكثر تحديدا من الاخر 
(x) اكثر تحديدا من (y) عندما يكون كل احتمالات (x) تصلح للنوع (y) ولكن العكس غير صحيح
وبالتالي byte هو الانسب لان كل الارقام في byte تصلح في short و long ولكن العكس غير صحيح ، وبالتالي تختار c# الاجراء ذو المدخل byte  Big Grin


ملاحظات هامة : 


1. هذه حالة خاصة جدا جدا جدا ، غالبا لن تمر بها في الحياه العملية ولكنها مهمة لفهم ماذا يحدث خلف الكواليس

2. الامر مختلف تماما بالنسبة ل VB 

قمت بتجربة الامر نفسه على الفيجوال بيسيك ، وكان الناتج long overload اي انه اختار النوع الاطول وليس الاكثر تحديدا ، وهذه ربما تكون احد الاختلافات الجوهرية بين اللغتين

كود :
Imports System

Class Program
   Private Shared Sub Main(ByVal args As String())
       Foo.Bar(0)
       Console.ReadLine()
   End Sub
End Class

Class Foo
   Public Shared Sub Bar(ByVal arg As Byte)
       Console.WriteLine("byte overload")
   End Sub

   Public Shared Sub Bar(ByVal arg As Short)
       Console.WriteLine("short overload")
   End Sub

   Public Shared Sub Bar(ByVal arg As Long)
       Console.WriteLine("long overload")
   End Sub
End Class
الرد
تم الشكر بواسطة: محمد كريّم , asemshahen5


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  معلومة ع الماشي ابراهيم ايبو 4 801 29-10-20, 02:50 AM
آخر رد: ba2e44ca9a

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم