الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

شرح كيفية عمل Override و Overload واستخدامهم في البرمجة المتقدمة

بدأه akramKamal في 5 أبريل 2009 · 1 رد · 13,883 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

هذا الموضوع لتوضيح كيفية عمل 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

تم تعديل هذه المشاركة بواسطة akramKamal في 5 أبريل 2009 في 15:08

قولوا لا اله الا الله تفلحوا

ومن يبتغي غير الاسلام دينا فلن يقبل منه وهو في الاخرة من الخاسرين- صدق الله العظيم

#2

ياسلااااااااام :clapping: الشرح حلو ان شاء الله أخلص المشروع حقي وحتابع معاك هذه الامور الهامة

فلسطين .. سوريا ..بورما ......وماذا بعد ؟!

سابقا

medo_programming

موقعي : www.alkhayat-it.com

مواضيع مهمه

-----------------------------------------------:

تعلم كل شىء عن الTriggers

مواضيع مشابهة