برمجة متقدمة -1- السنة الثانية قسم برمجيات م. تغريد حرفوش 08 تشرين األول 1 18
اللكمة املفتاحية Base تستخدم هذه الكلمة المفتاحية لتحديد باني االب الذي سيتم استدعاؤه في الصف االبن ضمنيا الباني في الصف االبن سؤاء االب بدون وسطاء مثال: كان بوسطاء او بدون وسطاء يستدعي باني اذا اردنا اجبار الباني في الصف االبن على استدعاء باني االب مع وسطاء يجيب استخدام الكلمة المفتاحية Base 08 تشرين األول 2 18
class SubClass : BaseClass SubClass(int id) : base() intsructions استدعاء اجباري لباني االب بدون وسطاء class SubClass : BaseClass SubClass(int id) : base(id) intsructions استدعاء اجباري لباني االب مع وسطاء 3 08 تشرين األول 18
محدد الوصول protected أي اننا نستطيع الوصول الى كل اعضاء الصف االب من االبن مثال: class A protected void DoWork() "); Console.WriteLine(" protected class Test static void Main(string[] args) A a = new A(); a.dowork(); 08 تشرين األول 4 18
Sealed عندما تسبق هذه الكلمة اسم الصف هذا يعني انه ال يمكن توريثه. sealed class A //... class B : A //... 08 تشرين األول 5 18
Override-Virtual اذا كان لدى االب طريقة ما واردنا ان تنفذ الطريقة عند االبن نحتاج هنا لتجاهل الطريقة الموجودة عند االب حتى نحقق ذلك يجب ان نكتب الكلمة المفتاحية Virtual عند الطريقة الموجودة عند الصف االب و نضع الكلمة Override عند الطريقة الموجودة عند الصف االبن التي سيتم تنفيذها بالفعل. 08 تشرين األول 6 18
مثال class Shape public virtual void Draw() Console.WriteLine("Drawing Shape..."); class Circle : Shape public override void Draw() Console.WriteLine("Drawing Circle..."); static void Main() Shape theshape = new Circle(); theshape.draw(); 08 تشرين األول 7 18
الخرج 08 تشرين األول 8 18
يمكن استخدام أكثر من overrideلطريقة virtualواحدة وذلك اذا كان هناك أكثر من صف يرثوا من صف ما ويكون نتيجة التنفيذ حسب نوع الغرض المنشأ وليس حسب نوع المؤشر. - يمكن استخدام الكلمة المفتاحية Newعند الطريقة في الصف االبن التي لها نفس اسم الطريقة في الصف األب للداللة على أنه ال يوجد تعددية أشكال. 08 تشرين األول 9 18
تعددية االشكال هي التحويل من نمط الى اخر الطريقة االولى هي طريقة القصر العادية CAST أي استخدام نمط الصف االب النشاء غرض من نمطالصف االبن. 08 تشرين األول 10 18
مثال: class A public void MethodA() class B : A public void MethodB() A a = new B(); : وبالتالي فانه من الممكن في # Cأن نكتب 08 تشرين األول 11 18
وهنا يجب أن نعامل هذا الغرض كغرض من الصف األب وليس االبن أي أنه يمكننا أن نصل الى أعضاء الصف األب مثال : a.methoda(); وال يمكن أن نصل الى أعضاء الصف االبن أي : a.methodb(); // error 08 تشرين األول 12 18
الطريقة الثانية هي استخدام نفس االسم للطريقة الموجودة في الصف االب class Shape والصف االبن public void Draw() Console.WriteLine("Drawing Shape..."); class Circle : Shape public void Draw() Console.WriteLine("Drawing Circle..."); static void Main() Shape theshape = new Circle(); theshape.draw(); اآلن لو قمنا بتعريف غرض كما يلي : 08 تشرين األول 13 18
الخرج 08 تشرين األول 14 18
الصفوف المجردة Abstract class ال يمكن انشاء غرض من الصفوف المجردة يمكن الوراثة من الصف المجرد الصف المجرد هو وببساطة صف أب يجب أن يشتق وان نعمل overrid للطرق المجردة التي يحتويها يجب أن يعاد كتابة هذه الطريقة بكتابة overrid أمام الطريقة التي يحققها في الصف االبن حتى بدون كتابة virual في ترويسة الطريقة المجردة الن هذه الطريقة تعتبر virual لكل صف يرث من هذا الصف المجرد. الطرق المجردة ال تنفذ اصال من قبل االبناء النها بدون اجسام. 08 تشرين األول 15 18
الواجهات intefaces في الوراثة يمكن للصف االب ان يكون له اكثر من ابن ولالبن اكثر من ابن اما ان يرث االبن من اكثر من اب فهي غير ممكنة الواجهات قامت بحل المشكلة وسمحت بالوراثة المتعددة هي اسماء metods فقط التحتوي على أي تحقيق أي ال يمكن كتابة أي كود بداخلها فهي تتكون من تصريح فقط دون كتابة تفصيالت ال يمكن انشاء غرض منها ال يمكن للواجهة اال ان تورث ال يمكن ان تحتوي طرق الواجهة على اجسام body( )Method يمكن للصف الواحد ان يحقق اكثر من واجهة 08 تشرين األول 16 18
الواجهة نحتاج اليها الن #c ال تسمح بالوراثة المتعددة Base1 Base2 derived 08 تشرين األول 17 18
الواجهة IBase1 IBase2 base 08 تشرين األول 18 18
عندما يقوم صف بالوراثة من واجهة نقول انه يقوم بتحقيق هذه الواجهة Implement عندما يقوم صف بالوراثة من صف مجرد او عادي نقول انه يقوم بالتمديد Extension الصف يحقق اكثر من واجهة وال يمدد اال صف واحد أن الواجهة تتضمن خصائص و دوال مجردة و يعاد تحقيقها في الصفوف التي تحقق هذه الواجهة. ال يمكننا كتابة محدد الوصول access modifier للعناصر الموجودة ضمن الواجهة و ذلك ألنها ضمنيا معرفة على أنها عامة public ولكن هذا ال يعني اننا يمكن ان نكتب محدد الوصول public يفضل البدء باسم الواجهة بالمحرف I 08 تشرين األول 19 18
ال يوجد اال اسماء الطرق ال يمكن انشاء اغراض من واجهة Car <<interface>> وجدبعض التحقيق ال يمكن انشاء اغراض من صف مجرد String car abstract يجب ان يحقق كل العمليات التي يرثها يمكن انشاء اغراض من صف فعلي BMW <<Extension>> 20 08 تشرين األول 18
عندما يقوم احد الصفوف بتحقيق الواجهة يجب ان يحقق كل ما بداخلها فهو ال يملك الخيار للجزء الذي يرغب بتحقيقه 08 تشرين األول 21 18
التصريح عن الواجهات بنفس طريقة التصريح عن صف ولكن مع استخدام الكلمة المحجوزة interface interface interface-name Return-type property-name set; get; Return-type method-name (parameter-list); 08 تشرين األول 22 18
interface grandf string Name( ); interface father int old(int year); class son: grandf, father... 08 تشرين األول 23 18
interface IShape int X set; get; //property int Y set; get; //property double surface(); //method 08 تشرين األول 24 18
class Circle : IShape int r; int x; int y; public Circle(int r,int x,int y) this.x = x; this.y = y; this.r = r; public int R set r = value; get return r; 08 تشرين األول 25 18
public int X set x = value; get return x; public int Y set y = value; get return y; public double surface() return 2 * Math.PI * r; 08 تشرين األول 26 18
class Program static void Main(string[] args) Circle c = new Circle(6, 1, 2); Console.WriteLine("the surface of your circle="+c.surface()); 08 تشرين األول 27 18
08 تشرين األول 28 18
يمكننا التعامل مع الواجهات كأي نمط معطيات يمكن أن نعرف منه متحوالت و بارمترات و لكن ال يمكن أن ننشأ غرض Instance من الواجهة ألنها ينطبق عليها مفهوم الصف المجرد إذا ما الحل!! يمكننا أن ننشأ مؤشر من الواجهة و إسناده إلى غرض من الصف الذي يحقق هذه الواجهة : IShape icircle=new Circle(4,3,1); 08 تشرين األول 29 18
الصف المجرد والواجهة الواجهة اليمكن ان تحتوي اال طرق مجردة وبدون استخدام كلمة abstract قبل الطريقة ال يمكن ال يمكن لواجهة ان نصرح عن متحوالت ليست public ال يمكن بناء غرض منها تكون ان ال يمكن ان تحقق واجهة أخرى الصف المجرد يمكن ان يحتوي على طرق مجردة وطرق غير مجردة يمكن التصريح باي محدد وصول يمكن لصف مجرد ان يشتق صف مجرد أخر ال يمكن بناء غرض منه ال يمكن ان يكون seald seald كل الطرق فيها مجردة ال يمكن أن نصرح فيها عن بواني وهوادم ال يمكن ان نصرح عن عضو فيها من نوع ليس بالضرورة يمكن... static يمكن... 08 تشرين األول 30 18
Garbage Collector ادارة داخلية للذاكرة تجميع االجزاء من الذاكرة التي لم نعد بحاجة اليها في البرنامج الحالي واعادتها الى ذاكرة النظام االغراض التي ال يوجد فائدة منها اي ان البرنامج انتهى من استخدامها. تحرير الموارد التي تم تخصيصها للبرنامج واعادة الذاكرة نستخدم new النشاء غرض من صف ما جديد اذا لم نقم بعملية الهدم يصبح هناك خسران وضياع في موارد النظام Resource Leak في باقي اللغات نحتاج الى هادم Garbage Collector تقوم باستخدام C# اي انها تستعيد بشكل الي الذاكرة 08 تشرين األول 31 18
امللفات يوجد في لغة # Cما يسمى فضاء االسماء :namespace الصفوف المتجمعة معا. والذي يعتبر كمكتبة من عندما نقوم بكتابة مجموعة من الصفوف في فضاء اسماء ما فاننا فعليا يمكننا اعادة استخدامها كمكتبة جاهزة للقيام بعمليات مفيدة منها دون الحاجة العادة كتابتها من جديد. من احد اشهر فضاءات االسماء هو System.IO هذا الفضاء يمكننا من التعامل مع دخل وخرج البرنامج من خالل ملفات ليست فقط الملفات ما نستطيع التعامل معه كدخل وخرج بل قواعد المعطيات ايضا. طريقة استدعاء هذه المكتبة using System.IO; 08 تشرين األول 32 18
حيتوي فضاء عىل الصفوف التالية :StreamReader هذا الصف يحتوي على باني بوسيط حيث ياخذ كوسيط دخل نص) string (هو بالتحديد مسارالملف بدءا من القرص وانتهاء بالحقة الملف.txt مثال: StreamReader R = new StreamReader("c:\\taghyfile.txt"); يجب مالحظة اننا هنا نفتح ملفا للقراءة وبالتالي يجب ان يكون الملف موجود مسبقا. 33 08 تشرين األول 18
مثال اكمل لقراءة ملف نيص using System; using System.IO; namespace tag class TagClass static void Main() StreamReader R = new StreamReader("c:\\tag1.txt"); string line ; while ( (line = R.ReadLine())!= null ) Console.WriteLine(line); R.Close(); 34 08 تشرين األول 18
:StreamWriter هذا الصف يحتوي على باني بوسيط حيث ياخذ كوسيط دخل نص) string (هو بالتحديد مسارالملف الجديد الذي نرد انشاؤه بدءا من القرص وانتهاء بالحقة الملف.txt مثال: StreamWriter w = new StreamWriter("c:\\tag2.txt"); يجب مالحظة اننا هنا ننشئ ملف جديد لنكتب فيه و لكن ماذ لو كان الملف موجود مسبقا ونريد التعديل عليه فقط وال نريد محي محتوياته نكتب نفس السطر السابق مع اضافة true على الشكل التالي: StreamWriter w = new StreamWriter("c:\\tag2.txt,true); 35 08 تشرين األول 18
مثال اكمل لكتابة ملف نيص using System; using System.IO; namespace tag class TagClass static void Main() StreamWriter w = new StreamWriter("c:\\tag2.txt"); for ( int i=1 ; i<=5 ; i++ ) w.writeline(i); w.close(); 08 تشرين األول 36 18
مالحظة الطرق الموجودة ضمن الصف StreamReader عمل هذه الطرق قراءة الحرف التالي مباشرة للمكان الحالي دون تغيير مكان المؤشر القراءة قراءة سطر كامل قراءة من مكان المؤشر حتى النهاية Peek() Read() ReadLine() ReadToEnd() 08 تشرين األول 37 18
الطرق الموجودة ضمن الصف StreamWriter اغالق شرح عمل هذه الطرق bufferمسح كافية محتويات ال سطر جديد كتابة مع سطر جديد كتابة عادية Close() Flush() NewLine WriteLine() Write() 08 تشرين األول 38 18
فضاء الاسامء IO هو عبارة عن فضاء أسماء يستخدم لقراءة وكتابة البيانات من والى السالسل والملفات. الصفوف الموجودة في فضاء : االسماء File TextReader BinaryReader FileSystemInfo Directory Stream TextWriter BinaryWriter 08 تشرين األول 39 18
BinaryReader & BinaryWriter هذه الصفوف مشتقة من System.Object تتعامل هذه الصفوف من البيانات من النوع Binary :BinaryReader قراءة البيانات الثنائية بعض الطرق الموجودة فيه 08 تشرين األول 40 18
08 تشرين األول 41 18
:BinaryWriter كتابة البيانات الثنائية من متحول الى سلسلة محددة من الطرق الموجودة فيه Close() Write() 08 تشرين األول 42 18
Stream Class هو عبارة عن صف مجرد بحيث يتم اشتقاقه من قبل العديد من الصفوف االخرى منها: A. Memory System B. BufferStream C. FileStream D. NetworkStream E. CryptoStream 08 تشرين األول 43 18
Memory System هو عبارة عن صف يستخدم لقراءة وكتابة البيانات من الذاكرة 08 تشرين األول 44 18
BufferStream صف يستخدم للقراءة من Buffer من البواني. ال والكتابة عليه ويملك اثنان 08 تشرين األول 45 18
FileStream صف يستخدم للقراءة والكتابة الى الملفات والوضع االفتراضي هو التزامن مع عمليات القراءة ةالكتابة. Read() و() Write تستخدمان للقرءاة والكتابة المتزامنين BeginRead() و Begin Write() تستخدمان للقرءاة والكتابة غيرالمتزامنين 08 تشرين األول 46 18
08 تشرين األول 47 18
NetworkStream يستخدم هذا الصف الرسال واستقبال البيانات عبر الشبكة و هو يستدعى ايضا من قبل فضاء االسماء : System.Net.Socket Read() ReadByte() Write() WrietByte() هذه الطرق تستخدم للقراءة والكتابة على السالسل وعلى البافر عبر الشبكة 08 تشرين األول 48 18
CryptoStream يستخدم لربط سلسلة من البيانات بأي غرض مشفر لتشفير البيانات ويمكن ان يستدعى من فضاء االسماء System.Security.Cryptography 08 تشرين األول 49 18
Directory and File Classes الصف Directory يحتوي على طرق ستاتيكي والتي تساعد في التعامل مع المجلدات والمجلدات الفرعية وبالتالي يمكن ان تستدعى بدون انشاء غرض من هذا الصف. الصف File يحتوي على طرق ستاتيكية ايضا تساعد في معالجة الملفات 08 تشرين األول 50 18
FileStreamInfo هو صف مجرد ومنه يشتق كال الصفين : DirectoryInfo FileInfo الصف DirectoryInfo هو صف يحتوي على طرق يمكن ان تستخدم لمعالجة المجلدات والمجلدات الفرعية وهذه الطرق غير ستاتيكية أي اننا يجب ان ننشيء غرض من هذا الصف للتعامل معها. الصف :FileInfo هو صف يحتوي على طرق للتعامل مع الملفات 08 تشرين األول 51 18
08 تشرين األول 52 18
08 تشرين األول 53 18
TextReader Class هو صف مجرد يشتق منه الصفين StreamReader StringReader تستخدم هذه الصفوف لقراءة سالسل من محارف الصف :StreamReader يقوم بقراءة المحرف في بايت من البيانات ويحوله الى النوع المحدد. الصف StringReader يستخدم لقراءة البيانات من السلسلة النصية المدخلة. 08 تشرين األول 54 18
08 تشرين األول 55 18
TextWriter Class هو صف مجرد يشتق منه StreamWriter StringWriter هذه الصفوف تستخدم لكتابة سالسل محرفية الصف :StreamWriter يستخدم لكتابة المحارف في سلسلة نصية. الصف :StringWriter يكتب البيانات في سلسلة نصية 08 تشرين األول 56 18
مالحظة: للمحاضرات بقية في كتاب برمجة متقدمة -2- للدكتور عمار زقزوق 08 تشرين األول 57 18