السلام عليكــم ورحمـة الله وبركاتــه ،،
هذا الموضوع لتوضيح كيفية عمل Override و Overload:
Overload و Override هو تغيير لطريقة التنفيذ وله أنواع عديدة منها :
Method Override وOperator Overload و Method Overload و Overload Data type
أولا : Method Override
أعتقد أن هذا النوع معروف وسهل الفهم لأننا نستخدمه كثيرا وهو أن تقوم بتعريف ميثود لها نفس باراميتر ميثود أخرى تم توريثها من خلال الكلاس الأب أو ما يسمى base class
لكي ننجح في عمل Override يجب أن يكون تعريف الميثود يحتوي على إحدى الكلمات المحجوزة التالية :
virtual : كلمة محجوزة تمكن من عمل override للميثود
abstract : كلمة محجوزة تدل على أن هذه الميثود لا تحتوي على كود
override : تدل على أن هذه الميثود موجوة في الكلاس الأب وسيتم اعادة استخدامها
مثال على ذلك :
class Program
{
static void Main(string[] args)
{
Studant s = new EngineeringStudant();
string txt= s.ToString();
}
class Studant
{
public override string ToString()
{
return "Studant has typed";
}
}
class EngineeringStudant : Studant
{
public override string ToString()
{
return "EngineeringStudant has typed";
}
}
}لاحظ أن النتيجة ستكون " EngineeringStudant has typed " وذلك لان كلاس EngineeringStudant قام بتغير طريق تنفيذ الميثود الخاصة بالكلاس Studant
ثانيا: Method Overload
هو كتابة أكثر من ميثود لهما نفس الاسم مع اختلاف في الباراميتر من حيث ترتبهم أو أنواعهم
مثال على ذلك
class Program
{
static void Main(string[] args)
{
int x = Add(1, 5);
int c = Add(1, 5, 2);
}
static int Add(int num1,int num2)
{
return num1 + num2;
}
static int Add(int num1, int num2, int num3)
{
return num1 + num2+num3;
}
}ثالثا : Overload Operator
يعتبر هذا الأمر مفيد جدا في البرمجة المتقدمة , حيث يمكنك من تغير طريقة عمل الOperators مثل + - * /
أو حتى == != وغيرهم
أحيانا تحتاج إلى تغيير نمط ال == للكلاس الذي أنشأته , ولنأخذ مثلا هذا الكود
class Program
{
static void Main(string[] args)
{
Number n1 = new Number(10.0);
Number n2 = new Number(10.0);
Console.WriteLine(n1 == n2);
Console.ReadLine();
}
class Number
{
public double Value;
public Number(double Value)
{
this.Value = Value;
}
}
}ستجد أن النتيجة False مع أن الرقمين لهما نفس القيمة , ولكن من المنطقي أن تكون النتيجة كذلك وذلك لأن ال == تعتمد على Object reference في الذاكرة وبالتالي n1 != n2 وذلك لأن كل كلاس له reference مختلف عن الأخر
ولكن أحيانا نحتاج إلى أن يكون n1==n2 إذا كان لهما نفس القيمة وليس نفس المرجع في الذاكرة فمن هنا وفرت السي شارب ذلك لمستخدميها
طريقة عمل Overload Operator
class Program
{
static void Main(string[] args)
{
Number n1 = new Number(10.0);
Number n2 = new Number(10.0);
Console.WriteLine(n1 == n2);
Console.ReadLine();
}
class Number
{
public double Value;
public Number(double Value)
{
this.Value = Value;
}
public static bool operator ==(Number n1, Number n2)
{
return n1.Value == n2.Value;
}
public static bool operator !=(Number n1, Number n2)
{
return n1.Value != n2.Value;
}
}
}لاحظ أننا قمنا بعمل تغير == و != في نفس الوقت وذلك لأن السي شارب ترفض عمل تغيير لواحد منهما دون الأخر وذلك لأنهم لهم نفس الوظيفة وهي المقارنة
ألان قم بتنفيذ الكود ستجد أن النتيجة True
رابعا : Data type Overload
أحيانا تحتاج أن يكون الكلاس الذي أنشأته مرن في العمليات المختلفة مثلا قم بملاحظة الكود التالي
class Program
{
static void Main(string[] args)
{
Number n1 = 10.0;
double n2 = new Number(20);
Number n3 = n1 * n2;
Console.WriteLine("n1= "+n1.Value);
Console.WriteLine("n2= " + n2);
Console.WriteLine("n3= " + n3.Value);
Console.ReadLine();
}
class Number
{
public double Value;
public Number(double Value)
{
this.Value = Value;
}
public static implicit operator double(Number number) //1
{
return number.Value;
}
public static implicit operator Number(double number) //2
{
return new Number(number);
}
}
}أنا متأكد أنك من أول نظرة على الكود أخذك العجب فكيف أن النوع double والنوع Number أصبحوا يتعاملون مع بعضهم البعض وكأنهم من نفس النوع وهذا هو المطلوب.
لاحظ الميثود //1 , تقوم هذه الميثود باعطاء السي شارب قيمة النوع Number بما يقابلها من النوع double , يعني أن السي شارب لو وجدت النوع double قد أعطي قيمة من النوع Number فإنها ستقوم بتنفيذ الميثود //1 لتحصل على القيمة المقابلة لهذا النوع
ونفس الكلام يعاد للميثود //2