اقرأ في هذا المقال
- ما هي الفئات Classes في السي شارب
- كتابة المعاملات Type parameters
- ما هي الفئات الأساسية Base classes
- ما هي الهياكل Structs
- ما هي الواجهات Interfaces
- ما المقصود بالتعداد Enums
تدعم لغة (#C) مفاهيم الوراثة وتعدد الأشكال، يمكن للفئة (class) أن ترث مباشرة من فئة أصل واحدة، ويمكنها تنفيذ أي عدد من الواجهات، تتطلب الطرق التي تتجاوز الطرق الافتراضية في فئة (class) أصل الكلمة الأساسية (override keyword) للتجاوز كطريقة لتجنب إعادة التعريف، يوفر (#C) فئة (class) السجل وأنواع بنية السجل، وهي أنواع الغرض منها تخزين قيم البيانات بشكل أساسي.
ما هي الفئات Classes في السي شارب
الفئات والكائنات Classes and objects
الفئات (classes): هي الأكثر من نوع أساسي في لغة البرمجة (#C)، الفئة هي عبارة عن بنية بيانات تجمع بين الحالة (الحقول) والإجراءات (الطرق وأعضاء الوظائف الأخرى) في وحدة واحدة، والتي تُعرف أيضًا باسم الكائنات (objects)، تدعم الفئات الوراثة وتعدد الأشكال و من خلالها يمكن للفئات المشتقة توسيع الفئات الأساسية وتخصيصها، يتم إنشاء فئات جديدة باستخدام تعريفات الفئة (class declarations)، حيث يبدأ (class declarations) من العنوان المحدد مثل :
- سمات ومعدلات الفئة (class).
- اسم الفئة (class).
- الفئة الأساسية (base class) عند التوريث من فئة أساسية.
- الواجهات المطبقة من قبل الفئة (class).
العنوان يتبع محتوى الفئة (class body) والذي يتكون من قائمة بإعلانات الأعضاء (member declarations) مكتوبة بين المحددات { and }، يُظهر الكود التالي إعلانًا عن فئة بسيطة تسمى (E3arabi):
public class Earabi
{
public int X { get; }
public int Y { get; }
public Point(int x, int y) => (X, Y) = (x, y);
}
يتم إنشاء مثيلات الفئات (classes) باستخدام عامل التشغيل الجديد (new operator)، الذي يخصص نموذج جديد، ويستدعي مُنشئًا (constructor) لتهيئة النموذج ثم يعيد الإشارة إلى النموذج، تقوم العبارات التالية بإنشاء نقطتين لكائنين (objects) وتخزين المراجع لتلك الكائنات في متغيرين:
var p1 = new Point(0, 0);
var p2 = new Point(10, 20);
يتم استعادة الذاكرة التي يشغلها الكائن (objects) تلقائيًا عندما يتعذر الوصول إلى الكائن.
كتابة المعاملات Type parameters
المعامِلات: هي قائمة بأسماء نوع معامِلات (Type parameters) محاطة بأقواس زاوية، حيث نكتب المعامِلات التي تتبع اسم الفئة (class)، يمكن بعد ذلك استخدام معامِلات النوع في نص إعلانات الفئة لتحديد أعضاء (body) الفئة، في المثال التالي معامِلات نوع الزوج هي (TFirst وTSecond):
public class Pair<TFirst, TSecond>
{
public TFirst First { get; }
public TSecond Second { get; }
public Pair(TFirst first, TSecond second) =>
(First, Second) = (first, second);
}
يُطلق على نوع الفئة (class) الذي تم الإعلان عنه لأخذ معلمات النوع نوع فئة عام (generic class)، يمكن أيضًا أن تكون أنواع البنية والواجهة والنوع عامة، عند استخدام الفئة العامة، يجب توفير وسيطات النوع لكل معاملة من معامِلات النوع (type parameters) مثال على ذلك:
var pair = new Pair<int, string>(1, “two”);
int i = pair.First; //TFirst int
string s = pair.Second; //TSecond string
النوع العام (generic type) الذي يحتوي على وسيطات النوع المقدمة مثل: (Pair <int ، string>) يسمى بالنوع المركب (constructed type).
ما هي الفئات الأساسية Base classes
قد يحدد اسم الفئة وكتابة المعامِلات واسم الفئة الأساسية بنقطتين، ويتم حذف مواصفات الفئة الأساسية (base class) التخصيص هو بالضبط مثل الاشتقاق من نوع الكائن (object)، في المثال التالي يوضح الفئة الأساسية (base class) لـ (Point3D هي Point)من المثال الأول، حيث أن الفئة الأساسية لـ (Point) هي كائن (object):
public class Point3D : Point
{
public int Z { get; set; }
public Point3D(int x, int y, int z) : base(x, y)
{
Z = z;
}
}
الفئة (class) ترث أعضاء فئتها الأساسية (base class) حيث الوراثة يعني أن الطبقة تحتوي ضمنيًا على جميع أعضاء صنفها الأساسي، لا ترث الفئة النموذج والمنشئ الثابت (static constructors) والصيغة النهائية، يمكن للفئة المشتقة (derived class) إضافة أعضاء (members) جدد إلى هؤلاء الأعضاء الذين ترثهم، لكن لا يمكنها إزالة تعريف العضو الموروث، في المثال السابق (Point3D) يرث أعضاء (X و Y) من (Point)، ويحتوي كل عضو (Point3D) على ثلاث خصائص: (X و Y و Z).
يوجد تحويل ضمني من نوع فئة إلى أي من أنواع فئاته الأساسية، يمكن لمتغير من نوع فئة أن يشير إلى مثيل (instance) لتلك الفئة أو مثيل (instance) لأي فئة مشتقة، على سبيل المثال، بالنظر إلى إعلامِات الفئة (class) السابقة، يمكن لمتغير من النوع (Point) أن يشير إما إلى (Point أو Point3D) معاً، مثال على ذلك:
Point a = new(10, 20);
Point b = new Point3D(10, 20, 30);
ما هي الهياكل Structs
تحدد الهياكل أنواع الفئات التي تدعم الوراثة وتعدد الأشكال، وأيضاً تمكنك من إنشاء سلوكيات معقدة تعتمد على التسلسل الهرمي للفئات المشتقة، فإن أنواع الهياكل هي أنواع أبسط هدفها الأساسي هو تخزين قيم البيانات، لا يمكن للهياكل التصريح عن نوع الأساسي (base type)، وأيضاً أنها مشتقة ضمنيًا من (System.ValueType) و لا يمكنك اشتقاق أنواع الهياكل الأخرى من نوع نفس البنية، لانها بشكل ضمني محجوزة، مثال على ذلك:
public struct Point
{
public double X { get; }
public double Y { get; }
public Point(double x, double y) => (X, Y) = (x, y);
}
ما هي الواجهات Interfaces
يتم تحديد واجهه عقدًا (contract) يمكن تنفيذه بواسطة الفئات والهيكل، أنت تحدد واجهة للإعلان المشتركة بين أنواع مختلفة، على سبيل المثال :تحدد الواجهة (System.Collections.Generic.IEnumerable <T>)، طريقة استخدام جميع العناصر في مجموعة و استخدامها مثل المصفوفة.
يمكن أن تحتوي الواجهة على أساليب والخصائص وأحداث ومفهرسات، تحدد فقط الأعضاء التي يجب توفرهم على واجهه بواسطة الفئات أو الهياكل، التي من خلالهم تنفذ الواجهة، قد تستخدم الواجهات الوراثة متعددة، على سبيل المثال: ترث الواجهة (IComboBox) من كل من (ITextBox) و(IListBox).
interface IControl
{
void Paint();
}
interface ITextBox : IControl
{
void SetText(string text);
}
interface IListBox : IControl
{
void SetItems(string[] items);
}
interface IComboBox : ITextBox, IListBox { }
يمكن للفئات (Classes) والهيكل (structs) تنفيذ واجهات متعددة، في المثال التالي: طبق الفئة (EditBox) كلاً من (IControl) و(IDataBound):
interface IDataBound
{
void Bind(Binder b);
}
public class EditBox : IControl, IDataBound
{
public void Paint() { }
public void Bind(Binder b) { }
}
عند تنفيذ الفئة أو الهيكل أو واجهة معينة، من تلك الفئة أو الهيكلية يمكن تحويلها ضمنيًا إلى نوع الواجهة ذاتها:
EditBox editBox = new();
IControl control = editBox;
IDataBound dataBound = editBox;
ما المقصود بالتعداد Enums
التعداد هو من يحدد نوع المجموعة من القيم الثابتة، مثال على ذلك الثوابت التي تحدد مجموعة الخضروات الجذرية المختلفة:
public enum SomeRootVegetable
{
HorseRadish,
Radish,
Turnip
}
يمكنك أيضًا تحديد تعداد لاستخدامه معًا على هيئة الأعلام، وهذا أعلام التالي يعلن مجموعة من الأعلام للفصول الأربعة، يمكن تطبيق أي مجموعة من المواسم، بما في ذلك قيمة “الكل” التي تشمل جميع المواسم:
[Flags]
public enum Seasons
{
None = 0,
Summer = 1,
Autumn = 2,
Winter = 4,
Spring = 8,
All = Summer | Autumn | Winter | Spring
}
يوضح المثال التالي أعلامات كل من التعدادات السابقة:
var turnip = SomeRootVegetable.Turnip;
var spring = Seasons.Spring;
var startingOnEquinox = Seasons.Spring | Seasons.Autumn;
var theYear = Seasons.All;
تحدثنا في هذا المقال عن الفئات في لغة السي الشارب، وكيفية استخدامها وتصنيفها وعن الهياكل والتعداد والواجهات وأنواعها و الفئات الأساسية.