19-09-20, 12:07 AM
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
من باب العلم بالشيء اذا كان هناك اكثر من اجراء يحمل نفس الاسم Overloads ونفس المدخلات ، هل تسائلت كيف يتم تحديد الاجراء الذي يتم استدعائة ؟
الامر بغاية البساطة ، يختار حسب نوع البيانات المدخل له ، لكن تخيل انك ادخلت نوع بيانات ليس باي overload ولكنه قابل للتحويل الي اي من مدخلات Overloads كأن تدخل رقما Integer والاجرائات بها نوع byte و short و long ، ماذا يحدث عندها
المثال التالي يشرح الموضوع بصورة جميلة جدا :
https://stackoverflow.com/questions/1645...0#16459680
لدينا كلاس بسيط به 3 اجرائات بنفس الاسم overloads ولهم نفس المدخل arg من 3 انواع byte وshort و long
كل ما تقوم به الاجرائات هو طباعة ان هذا الاجراء الذي يقبل النوع التالي تم استدعاءه
في ال Main نقوم باستدعاء الاجراء Bar ونرسل له اي قيمة صحيحة ، 0 مثلا ، نجد ان النتيجة : byte overload
اي ان الاجراء صاحب المدخل byte تم استدعاءه ، لماذا حدث ذلك ؟
احد المعلقين على البوست يشرح السبب :
اي قيمة ثابتة من نوع Integer مثل ال 0 في حالتنا ، هو قابل للتحويل لاي نوع عدد صحيح مناسب له ( short , byte , long ) وبالتالي الان ال 3 اجرائات مناسبين للقيمة المدخلة ، كيف نقوم بتحديد اي اجراء سيتم استدعائه ؟ انه الاجراء الذي يكون مدخله اكثر تحديدا من الاخر
(x) اكثر تحديدا من (y) عندما يكون كل احتمالات (x) تصلح للنوع (y) ولكن العكس غير صحيح
وبالتالي byte هو الانسب لان كل الارقام في byte تصلح في short و long ولكن العكس غير صحيح ، وبالتالي تختار c# الاجراء ذو المدخل byte
ملاحظات هامة :
1. هذه حالة خاصة جدا جدا جدا ، غالبا لن تمر بها في الحياه العملية ولكنها مهمة لفهم ماذا يحدث خلف الكواليس
2. الامر مختلف تماما بالنسبة ل VB
قمت بتجربة الامر نفسه على الفيجوال بيسيك ، وكان الناتج long overload اي انه اختار النوع الاطول وليس الاكثر تحديدا ، وهذه ربما تكون احد الاختلافات الجوهرية بين اللغتين
السلام عليكم ورحمة الله وبركاته
من باب العلم بالشيء اذا كان هناك اكثر من اجراء يحمل نفس الاسم 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
ملاحظات هامة :
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