You are on page 1of 9

‫جامعة ادلب‬

‫كلية الهندسة المعلوماتية‬


‫السنة الثانية‪ -‬مادة برمجة متقدمة ‪1‬‬

‫‪: abstract‬‬
‫هي عبارة عن كلمة محجوزة تأتي مع الـ ‪ Class‬أو الدالة (‪ )method‬وعندما تأتي مع الـ ‪ class‬فال يمكننا‬
‫أن نأخذ كائن (‪ )object‬أو نسخة من هذا الـ ‪ Class‬ويكون فقط للوراثة ‪ .‬أُنشئ لكي يخدم ‪ classe‬أخرى ‪.‬‬

‫النوع األول‪ :‬يكون الـ ‪:)abstract( class‬‬

‫مثال ‪:‬‬

‫‪abstract class E‬‬


‫{‬
‫;‪public int x‬‬
‫}‬
‫‪class M : E‬‬
‫{‬
‫‪public int num‬‬
‫{‬
‫} ;‪set { x = value‬‬
‫} ;‪get { return x‬‬
‫}‬
‫}‬
‫‪class Program‬‬
‫{‬
‫)‪static void Main(string[] args‬‬
‫{‬
‫خطأ ال نستطيع أخذ نسخة منه‪E e = new E();//‬‬
‫;)(‪M m = new M‬‬
‫;‪m.num = 2‬‬
‫;)‪Console.WriteLine(m.num‬‬

‫}‬
‫}‬

‫}‬

‫‪1‬‬ ‫م‪.‬بسمة سراقبي‬


‫جامعة ادلب‬
‫كلية الهندسة المعلوماتية‬
‫السنة الثانية‪ -‬مادة برمجة متقدمة ‪1‬‬
‫اذا ً الـ ‪ class‬الذي يكون ‪ abstract‬ممنوع التعامل المباشر معه فيما عدا الوراثة ‪.‬‬

‫النوع الثاني الذي يكون ‪ abstract‬هي الدوال ‪:‬‬

‫الدالة التي تكون ‪ abstract‬تكون أيضا ً بداخل ‪ abstract class‬وتكون الدالة مجردة أي رأس‬
‫الدالة فقط بدون الكود بداخلها ‪ ,‬لكن بشرط أن من يرث هذا الـ ‪ class‬يجب أن يكتب الكود بداخل هذه‬
‫الدالة الـ ‪ , abstract‬هي تشبه ‪(interface‬سنتحدث عنه الحقا) إلى حد ما ‪ .‬لكن ال تخلط بين‬
‫االثنين ألن تلك دالة (‪ )method‬بينما هذا ‪. interface‬‬

‫وعند كتابة كود الدالة في الـ ‪ class‬االبن نكتب نفس رأس الدالة ونكتب ‪ override‬عوضا ً عن‬
‫‪ abstract‬ثم نكتب الكود ‪.‬‬

‫الفرق بين ‪ virtual‬و ‪: abstract‬‬

‫‪ :Virtual‬يجب أن نكتب كود الدالة التي تكون ‪ virtual‬أي ال تكون دالة مجردة ‪.‬‬

‫‪ : abstract‬يجب أن ال نكتب كود الدالة التي تكون ‪ abstract‬أي تكون مجردة ‪.‬‬

‫مثال ‪:‬‬

‫‪abstract class E‬‬


‫{‬
‫;)(‪public abstract void print‬‬
‫)(‪public virtual void view‬‬
‫{‬
‫;)"‪Console.WriteLine("hello‬‬
‫}‬
‫}‬
‫‪class M : E‬‬
‫{‬
‫)(‪public override void print‬‬
‫{‬
‫;)"‪Console.WriteLine("show‬‬
‫}‬
‫)(‪public override void view‬‬
‫{‬
‫;)"‪Console.WriteLine("hi‬‬
‫}‬

‫‪2‬‬ ‫م‪.‬بسمة سراقبي‬


‫جامعة ادلب‬
‫كلية الهندسة المعلوماتية‬
‫السنة الثانية‪ -‬مادة برمجة متقدمة ‪1‬‬
‫}‬

‫‪: Sealed‬‬
‫تأتي مع تعريف الـ ‪ Class‬و الدوال(‪ )method‬عندما تأتي مع الـ ‪ Class‬فهذا يعني أنه ممنوع وراثة هذا‬
‫الكالس ‪ ,‬بينما يمكننا التعامل معه بطريقة عادية ونستطيع أخذ نسخ منه أو كائن (‪. )object‬‬

‫مثال ‪:‬‬

‫‪sealed class A‬‬


‫{‬
‫}‬
‫‪class B : A‬‬
‫{‬

‫}‬

‫سيحدث خطأ أثناء معالجة الكود ألنه ال يمكن وراثة الـ ‪ Class‬الذي يكون ‪ sealed‬أما في حالة الدوال ‪:‬‬

‫فالدالة التي تكون ‪ sealed‬فهذا يعني أنه ال يمكن عمل ‪ override‬لهذه الدالة في ‪ class‬آخر ‪.‬‬

‫مثال ‪:‬‬

‫‪class A‬‬
‫{‬
‫)(‪public sealed virtual void print‬‬
‫{‬
‫;)"‪Console.WriteLine("c#‬‬
‫}‬
‫}‬
‫‪class B : A‬‬
‫{‬
‫)(‪public override void print‬‬
‫{‬
‫;)"‪Console.WriteLine("hello‬‬
‫}‬

‫}‬

‫‪3‬‬ ‫م‪.‬بسمة سراقبي‬


‫جامعة ادلب‬
‫كلية الهندسة المعلوماتية‬
‫السنة الثانية‪ -‬مادة برمجة متقدمة ‪1‬‬

‫سيحدث خطأ أثناء معالجة الكود ألنه ال يمكن عمل ‪ override‬لدالة ‪.sealed‬‬

‫فائدة ‪ sealed‬أنها تمنع إعادة استخدام محتويات الـ ‪ class‬في ‪ class‬آخر أو إعادة استخدام دالة بنفس االسم‬
‫ونفس المدخالت في ‪ class‬آخر ‪.‬‬

‫يتحدث هذا الدرس عن موضوعين مهمين في سي شارب وهما الواجهات ‪ interfaces‬والمجموعات‬


‫‪ . Collections‬تعتبر المجموعات ‪ Collections‬من المزايا القوية والمهمة في سي شارب ‪ .‬وهي‬
‫وسيلة لتخزين العناصر ضمن بنية قابلة للتوسّع تلقائيا ً وسهلة التعامل ‪ .‬اذا ً فهي تشبه المصفوفات ‪ ,‬باستثناء‬
‫أن المصفوفات ذات حجم ثابت وهي تبقى كذلك منذ لحظة انشائها ‪ ,‬أما المجموعات فهي على النقيض من‬
‫ذلك ‪ ,‬فهي بنية قابلة للتوسّع بقدر ما نرغب ‪ .‬باإلضافة إلى أن للمجموعات أشكال عديدة مفيدة جدا ً ‪ ,‬فهناك‬
‫المكدس ‪ stack‬والرتل ‪ queue‬والقاموس ‪ dictionary‬وغيرها من البنى المهمة ‪.‬‬

‫سنتناول في هذا الدرس المجموعات العاديّة‪ ،‬والمجموعات العموميّة ‪ generics collections.‬سنبدأ هذا‬
‫مجردة‪ ،‬حيث تصف سمات‬
‫ّ‬ ‫الدرس بالحديث المختصر عن الواجهات‪ ،‬وهي تشبه األصناف ولكن بصورة‬
‫عا ّمة ينبغي أن تتحلّى بها األصناف التي تح ّققها‪.‬‬

‫كلمة عن الواجهات ‪:‬‬

‫ليست فكرة الواجهات ‪ Interfaces‬محصورة ً بسي شارب‪ ،‬فهي موجودة أي ً‬


‫ضا في لغات برمجة أخرى‬
‫مثل جافا ‪ Java.‬تشبه الواجهة ‪ Interface‬الصنف ‪ Class‬بشكل كبير‪ ،‬فهي تضم خصائص وتوابع‪،‬‬
‫ولكن كتصاريح فقط‪ ،‬بدون شيفرة تحوي عبارات برمجيّة‪ ،‬وبدون محدّدات وصول‪ .‬كما ال تحتوي على‬
‫مجرد فحسب‪ .‬يمكن‬
‫ّ‬ ‫تعرف الهيكل العام بشكل‬ ‫حقول ‪ fields‬وال على بواني‪ .‬تستطيع القول ّ‬
‫أن الواجهة ّ‬
‫االستفادة من الواجهة عندما نحقّقها ‪ implement.‬فعندما يرث صنف ما من واجهة‪ ،‬فيجب عليه أن يعيد‬
‫التصريح عن جميع الخصائص والتوابع الموجودة ضمن هذه الواجهة ولكن مع تزويدها بحواضن تحوي‬
‫الشيفرة المطلوب تنفيذها‪.‬‬

‫‪4‬‬ ‫م‪.‬بسمة سراقبي‬


‫جامعة ادلب‬
‫كلية الهندسة المعلوماتية‬
‫السنة الثانية‪ -‬مادة برمجة متقدمة ‪1‬‬

‫تصرح عن تابع أو خاصيّة‪ ،‬وتترك للصنف‬ ‫ّ‬ ‫فكأن الواجهة تح ّقق مبدأ التعدديّة الشكليّة بشكل ممتاز‪ ،‬فهي‬
‫ّ‬
‫الذي يحقّقها (يرث منها) حريّة التعبير عن هذا التابع أو هذه الخاصيّة بالشكل المالئم‪.‬‬

‫تُستخدم الواجهات على نحو واسع جدًّا في سي شارب‪ ،‬وتتبع تسميتها لنفس أسلوب تسمية األصناف‪ ،‬مع‬
‫األول‬
‫ي واجهة هو الحرف الطباعي الكبير ‪ I‬وهو الحرف ّ‬ ‫األول من اسم أ ّ‬
‫االصطالح على أن يكون الحرف ّ‬
‫من كلمة ‪ Interface.‬في الحقيقة لقد ح ّلت الواجهات مشكلة الوراثة المتعدّدة (الوراثة من أكثر من صنف‬
‫بنفس الوقت) والتي كانت تتمتّع بها لغة ‪ C++‬فقط‪ .‬اآلن أصبح بإمكان أي صنف أن يرث من صنف آخر‬
‫واحد فقط‪ ،‬باإلضافة إلى تحقيقه ألي عدد يرغبه من الواجهات‪.‬‬

‫ُصرح عن الواجهة بالكلمة المحجوزة ‪interface.‬انظر البرنامج ‪oop_7‬الذي يوضّح استخدام‬


‫ي ّ‬
‫الواجهات‪.‬‬

‫استعرت‬ ‫لقد‬ ‫األصناف ‪Animal‬و ‪Bird‬و ‪Frog‬و ‪Fish‬؟‬ ‫تذكر‬ ‫هل‬


‫أن الصنف ‪Frog‬كان يرث من‬‫الصنفين ‪Animal‬و ‪Frog‬لتوضيح فكرة استخدام الواجهات‪ ،‬تذ ّكر ّ‬
‫أن الكائنات الحيّة تتن ّفس ‪Breathing.‬لذلك‬
‫الصنف ‪Animal.‬في الحقيقة لقد استفدت من فكرة ّ‬
‫ي‪،‬‬ ‫أنشئت واجهة اسمها ‪IBreathing‬لتعبّر عن عمليّة التن ّفس‪ ،‬وبما ّ‬
‫أن الضفدع ‪Frog‬هو كائن ح ّ‬
‫فمن الطبيعي أن يحقّق هذه الواجهة‪ .‬تحتوي الواجهة ‪IBreathing‬على تابع وحيد‬
‫طا واحدًا من النوع ‪ double‬يُعبّر عن كميّة األكسجين التي سيحصل‬ ‫اسمه ‪ TakeBreath‬يقبل وسي ً‬
‫ضا تمثّل كميّة األكسجين‬
‫ي عند التنفّس‪ ،‬كما يُرجع هذا التابع قيمة من النوع ‪ double‬أي ً‬
‫عليها الكائن الح ّ‬
‫التي بقيت بعد عمليّة التنفّس‪.‬‬

‫يرث الصنف ‪Frog‬هذه الواجه ‪ ،‬ويحقّقها من خالل إعادة تعريف التابع ‪ TakeBreath‬حيث يُعبّر‬
‫عن عمليّة التنفّس بالشكل الذي يناسبه (سيستهلك في مثالنا هذا ‪ %20‬من كميّة األكسجين التي يحصل عليها)‪.‬‬
‫ي" بصرف النظر عن كونه يرث من‬ ‫ي "كائن ح ّ‬
‫في الحقيقة يمكن استخدام الواجهة ‪IBreathing‬مع أ ّ‬
‫الصنف ‪(Animal‬الذي يمثّل الصنف الحيواني) أو من الصنف ‪(Mammal‬الثديّيات) ً‬
‫مثال أو غيره‪،‬‬
‫ألن جميع الكائنات الحيّة تشترك معًا بخاصيّة التنفّس‪ ،‬وهنا تكمن ّ‬
‫قوة الواجهات‪.‬‬ ‫وذلك ّ‬

‫‪namespace oop_7‬‬
‫{‬
‫‪interface IBreathing‬‬
‫{‬
‫;)‪double TakeBreath(double oxygen_amount‬‬

‫‪5‬‬ ‫م‪.‬بسمة سراقبي‬


‫جامعة ادلب‬
‫كلية الهندسة المعلوماتية‬
1 ‫ مادة برمجة متقدمة‬-‫السنة الثانية‬
}
class Animal
{
public virtual void Move()
{
Console.WriteLine("Animal: Move General Method");
}
}
class Frog : Animal, IBreathing
{
public override void Move()
{
Console.WriteLine("Frog - Move: jumping 20 cm");
}
public double TakeBreath(double oxygen_amount)
{
return oxygen_amount * 0.8;
}
}
class Program
{
static void Main(string[] args)
{
double oxygent_to_breath = 10;
IBreathing frog = new Frog();
Console.WriteLine("Oxygen amount before breath:
{0}", oxygent_to_breath);
Console.WriteLine("Oxygen amount after breath:
{0}", frog.TakeBreath(oxygent_to_breath));
Console.ReadKey();
}
}
}

ّ ‫ انظر إلى السطر الذي قمنا فيه باستنساخ كائن ستجد أنّنا قد‬.‫هناك أمر آخر جدير بالمالحظة‬
‫صرحنا عن‬
‫ وهذا أمر‬،Frog ‫ث ّم أسندنا إليه مرج ًعا لكائن من النوع‬IBreathing ‫من النوع‬frog ‫المتغيّر‬
IBreathing. ‫يرث من الواجهة‬Frog ‫ألن الصنف‬ ّ ‫صحيح تما ًما وشائع جدًّا‬

:‫عند تنفيذ البرنامج ستحصل على الخرج التالي‬

6 ‫بسمة سراقبي‬.‫م‬
‫جامعة ادلب‬
‫كلية الهندسة المعلوماتية‬
‫السنة الثانية‪ -‬مادة برمجة متقدمة ‪1‬‬

‫هي عبارة عن مجموعة من الـ ‪ classes‬يمكننا أن نستخدم الـ ‪ namespace‬لكي ننظم الكود أكثر‬
‫ويكون مفهوما ً أكثر ‪ ,‬يمكن أن يكون لدينا أكثر من ‪ namespace‬في نفس المشروع ‪ ,‬ويمكن أن يوجد‬
‫‪ class‬في ‪ namespace‬بنفس اسم ‪ class‬آخر في ‪ namespace‬أخرى ‪.‬‬

‫يتم استخدامها عن طريق الكلمة المحجوزة ‪ namespace‬ثم االسم الذي نريده ونكتب بداخلها كل الـ‬
‫‪ classes‬التي نريد ‪.‬‬

‫ويتم استدعائها عن طريق الكلمة المحجوزة ‪. using‬‬

‫في بداية كل كود نكتب ‪ , using system‬وكلمة ‪ system‬هي عبارة عن ‪ namespace‬تحتوي على‬
‫العديد من الـ ‪ , classes‬مثل ‪ Console‬الذي نستخدمه في عمليات االدخال واإلخراج ‪.‬‬

‫ويتم استدعاء ما بداخل كل ‪ namespace‬عن طريق النقطة (‪. ).‬‬

‫فمثال استدعاء ما بداخل كل ‪ namespace‬التي بداخل ‪ , system‬واستدعاء دالة اإلخراج أيضا ً من‬
‫‪ Console‬فيكون االستدعاء على الشكل التالي ‪:‬‬

‫;)(‪System.Console.WriteLine‬‬

‫مثال ‪:‬‬

‫;‪using D‬‬
‫‪namespace Test‬‬
‫{‬
‫‪class prog1‬‬
‫{‬

‫‪7‬‬ ‫م‪.‬بسمة سراقبي‬


‫جامعة ادلب‬
‫كلية الهندسة المعلوماتية‬
1 ‫ مادة برمجة متقدمة‬-‫السنة الثانية‬
public void view()
{
Console.WriteLine("I am namespace Test class
prog1 ");
}
}
class Program
{
static void Main(string[] args)
{
D.prog1 P1 = new D.prog1();
P1.view();
A a = new A();
prog1 p2 = new prog1();
p2.view();

}
}

}
namespace D
{
class prog1
{
public void view()
{
Console.WriteLine("I am namespace D class
prog1");
}
}
class A
{
public void show()
{
Console.WriteLine("I am namespace D class A ");
}
}
}

8 ‫بسمة سراقبي‬.‫م‬
‫جامعة ادلب‬
‫كلية الهندسة المعلوماتية‬
‫السنة الثانية‪ -‬مادة برمجة متقدمة ‪1‬‬
‫في أول سطر داخل الدالة ‪ Main‬كتبنا ‪ D.prog1‬لكي يذهب إلى الـ ‪ class‬في الـ ‪ namespace‬التي‬
‫نحددها ألنه يوجد ‪ class‬بنفس االسم في الـ ‪ namespace‬الرئيسية ‪ ,‬فلو لم نحدد الـ ‪namespace‬‬
‫كان سيذهب إلى الـ‪ class‬الذي كان في الـ ‪ namespace‬الرئيسية ‪ ,‬وبما أن الـ ‪ Class‬الذي اسمه ‪A‬‬
‫ال يوجد ‪ class‬آخر بنفس اسمه فنستدعيه مباشرة ً بدون الحاجة إلى تحديد الـ ‪ namespace‬التي تحتويه‪.‬‬

‫ويمكن أن نكتب ‪ namespace‬كاملة بداخل ‪ namespace‬بنفس الطريقة ونستدعيها بهذا الشكل ‪:‬‬

‫مثال ‪:‬‬

‫;‪using Test1.Test2‬‬
‫‪namespace Test1‬‬
‫{‬
‫‪class prog1‬‬
‫{‬
‫)(‪public void view‬‬
‫{‬
‫‪Console.WriteLine("I am namespace Test class‬‬
‫;)" ‪prog1‬‬
‫}‬
‫}‬
‫‪class Program‬‬
‫{‬
‫)‪static void Main(string[] args‬‬
‫{‬
‫;)"‪Console.WriteLine("Main Function‬‬
‫}‬
‫}‬
‫‪namespace Test2‬‬
‫{‬
‫‪class prog2‬‬
‫{‬
‫)(‪public void show‬‬
‫{‬
‫;)" ‪Console.WriteLine("hello world‬‬
‫}‬
‫}‬

‫‪9‬‬ ‫م‪.‬بسمة سراقبي‬

You might also like