برمجة كائن-مهيأ (C# و Visual Basic)
كل اللغات التي تمت ادارتها في .NET Framework مثل Visual Basic و#C ، توفر دعمًا كاملاً للبرمجة االكينونية بما في ذلك التغليف, التوريث و polymorphism.
التغليف يعني أن مجموعة من الخصائص ذات الصلة وأساليب الأعضاء آخرين تعامل على أنها وحدة مفردة أو كائن.
التوريث يصف القدرة على إنشاء فئات جديدة تستمد خصائصها من فئة موجودة.
polymorphism يعني أنه يمكن أن يكون لديك فئات متعددة ويمكن إستخدامها بشكل تبادلي, على الرغم من أن كل فئة تقوم بتنفيذ نفس الخصائص أو الأساليب بطرق مختلفة.
يصف هذا القسم المفاهيم التالية:
فئات وكائنات
الأعضاء الفئة
الحقول والخصائص
الأساليب
جهات الإنشاء
الدوال المُدمّره
أحداث
فئات متداخلة
الوصول المعدلات و مستويات الوصول
إنشاء فئات
الفئات و الأعضاء الثابتة (مشتركة)
أنواع مجهولة
الوراثة
- تجاوز الأعضاء
الواجهات
عام
المفوضون
فئات وكائنات
المصطلحات فئة و الكائن تستخدم أحياناً بالتبادل ولكن في الحقيقة، الفئات توصف نوع الكائنات، بينما تكون الكائنات مثيلاتفئات قابلة للإستخدام . لذا، تسمى عملية إنشاء كائن إنشاء المثيل . بإستخدام blueprint analogy ، فئة blueprint وتعد كائن إنشاء التي تم إجراؤها من ذلك blueprint.
لتعريف الفئة
Class SampleClass
End Class
class SampleClass
{
}
كلا Visual Basic و C# توفران أيضاً إصدار خفيف من الفئات تسمى بنيات مما يعتبرو مفيدين عندما تحتاج إلى إنشاء صفيف كبير من الكائنات و لا تريد استهلاك ذاكرة كثيرة لذلك.
لتعريف البنية:
Structure SampleStructure
End Structure
struct SampleStruct
{
}
لمزيد من المعلومات، راجع:
Visual Basic
C#
الأعضاء الفئة
يمكن أن تحتوي كل فئة على الأعضاء الفئة مختلفة تتضمن الخصائص التي تصف بيانات الفئة و الأساليب التي تعرّف سلوك الفئة و الأحداث التي توفر الاتصالات بين الفئات المختلفة والكائنات.
الحقول والخصائص
الحقول والخصائص تمثل المعلومات الذي يحتويها كائن. الحقول تشبه المتغيرات حيث أنها يمكن قراءتها أو تعيينها مباشرةً.
لتعريف حقل:
Class SampleClass
Public SampleField As String
End Class
Class SampleClass
{
public string sampleField;
}
على الخصائص الحصول على الإجراءات وتعيينها, مما بوفر تحكم أكبر على كيفية تعيين القيم أو إرجاعها.
كلاC# و Visual Basic تسمح لك إما إنشاء حقل لتخزين القيمة الخاصية خاصة أو إستخدام الخصائص المنفذة تلقائياً الذي ينشئ هذا الحقل تلقائياً و توفر المنطق الأولي لإجراءات الخاصية.
لتعريف إحدى خصائص تنفيذ تلقائي:
Class SampleClass
Public Property SampleProperty as String
End Class
class SampleClass
{
public int SampleProperty { get; set; }
}
إذا كنت تحتاج إلى إجراء بعض العمليات الإضافية للحصول على القيمة خاصية القراءة والكتابة تعريف حقل لتخزين القيمة الخاصية وتوفير منطق الأساسية تخزين واستردادها:
Class Samplelass
Private m_Sample As String
Public Property Sample() As String
Get
' Return the value stored in the field.
Return m_Sample
End Get
Set(ByVal Value As String)
' Store the value in the field.
m_Sample = Value
End Set
End Property
End Class
class SampleClass
{
private int _sample;
public int Sample
{
// Return the value stored in a field.
get { return _sample; }
// Store the value in the field.
set { _sample = value; }
}
}
تحتوي معظم خصائص أساليب أو إجراءات كلاهما وأردت تعيين القيمة الخاصية. ومع ذلك، يمكنك إنشاء خاصية للقراءة فقط أو للكتابة فقط لتقييدهم من التعديل أو القراءة. في Visual Basic يمكنك إستخدام الكلمات الأساسية ReadOnlyو WriteOnly. في C# ، يمكنك حذف أسلوب الخاصية getأو set. ومع ذلك، في كلاهما Visual Basic و C# ، لا يمكن تنفيذ تلقائي خصائص للقراءة فقط أو للكتابة فقط.
لمزيد من المعلومات، راجع:
Visual Basic
C#
الأساليب
الأسلوب هو إجراء الذي يمكن لكائن تنفيذه.
ملاحظة
في Visual Basic، توجد طريقتان لإنشاء أسلوب: عبارة Subتستخدم إذا كان الأسلوب الذي لا يُرجع القيمة; تستخدم عبارة Function إذا قام الأسلوب بإرجاع القيمة.
لتعريف أسلوب فئة:
Class SampleClass
Public Function SampleFunc(ByVal SampleParam As String)
' Add code here
End Function
End Class
class SampleClass
{
public int sampleMethod(string sampleParam)
{
// Insert code here
}
}
يمكن أن يكون للفئة العديد من تطبيقات أو تساعد ، من نفس الطريقة و تختلف في رقم معلمات أو أنواع المعلمات.
أساليب زيادة التحمل:
Overloads Sub Display(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
public int sampleMethod(string sampleParam) {};
public int sampleMethod(int sampleParam) {}
في معظم الحالات تعلن أسلوب داخل تعريف فئة. ومع ذلك، كلا Visual Basic و C# يدعمان أساليب ملحق التي تسمح لك بإضافة أساليب إلى فئة موجودة خارج تعريف الفئة الفعلي.
لمزيد من المعلومات، راجع:
Visual Basic
C#
جهات الإنشاء
الدالة الإنشائية هي فئات تنفذ تلقائياً عندما ينشئ كائن من نوع معطى. تهيّئ الدالّات الإنشائية عادةً البيانات للكائنات الجديدة. الدالة الإنشائية يمكنها أن تنفذ مرة واحدة فقط عند إنشاء فئة. علاوة على ذلك، التعليمات البرمجية في الدالة الإنشائية يتم تنفيذها دوماً قبل أي تعليمات برمجية أخرى في الفئة. ومع ذلك، يمكنك إنشاء عدة الدالة الإنشائية تساعد بالطريقة نفسها من أجل أي أسلوب.
لتعريف دالة إنشائية لفئة:
Class SampleClass
Sub New(ByVal s As String)
// Add code here.
End Sub
End Class
public class SampleClass
{
public SampleClass()
{
// Add code here
}
}
لمزيد من المعلومات، راجع:
Visual Basic
C#
الدوال المُدمّره
تستخدم المتلفات لاتلاف مثيلات الفئات. في .NET Framework جامع البيانات المهملة يقوم بإدارة تخصيص و إطلاق الذاكرة للكائنات في التطبيق الخاص بك. ومع ذلك، قد تزال بحاجة destructors لمسح أي موارد غير مدارة التي ينشئها التطبيق الخاص بك. يمكن أن يكون هناك واحد فقط destructor لفئة.
للحصول على معلومات حول ال destructors ومجموعة البيانات المهملة في ".NET Framework،" راجع تجميع البيانات المهملة.
أحداث
تمكّن الأحداث أي فئة أو كائن من إعلام الفئات أو الكائنات الأخرى عند حدوث شيء مرغوب. الفئة التي ترسل (أو ترفع) الحدث تسمى بالناشرة والفئات التي تتلقى (أو تعالج) الحدث تسمى بالمشتركة. للحصول على معلومات أكثر حول الأحداث و كيفية تشغيلها و معالجتها قم بمراجعة معالجة و إظهار الأحداث.
Visual Basic
إلى الإعلان عن الأحداث, إستخدم أحداث كشف حساب.
لترفع الأحداث, إستخدم بيان RaiseEvent.
لتحديد معالجات الحدث بإستخدام الطريقة التعريفية, إستخدم العبارة WithEvents (Visual Basic)و جملة يعالج عبارة (Visual Basic).
لتكون قادراً على إضافة بشكل حيوي قم بإزالة ثم تغيير معالج الأحداث المقترنة بحدث ما إستخدام بيان AddHandlerو بيان RemoveHandlerمع عامل التشغيل AddressOf.
C#
لتصريح بالحدث في فئة قم بإستخدام الكلمة الأساسية الحدث (C# مرجع).
لتنفيذ حدث استدعاء قم ب تفويض الحدث.
للاشتراك في حدث, إستخدام عامل التشغيل+=; لإلغاء الاشتراك من حدث إستخدم عامل التشغيل -=.
فئات متداخلة
الفئة المعرفة داخل فئة آخر تسمى المتداخلة . بشكل افتراضي ، تعتبر الفئة المتداخلة خاصة .
Class Container
Class Nested
' Add code here.
End Class
End Class
class Container
{
class Nested
{
// Add code here.
}
}
لإنشاء مثيل لفئة متداخلة إستخدم اسم الفئة الحاوية متبوعاً بالنقطة ومن ثم يتبعها اسم الفئة المتداخلة:
Dim nestedInstance As Container.Nested = New Container.Nested()
Container.Nested nestedInstance = new Container.Nested()
الوصول المعدلات و مستويات الوصول
يمكن لكل الفئات وأعضاء الفئات أن يحددو ما هو مستوى الوصول التي يمكن توفرها إلى الفئات الأخرى بواسطة إستخدام معدّلات الوصول .
معدّلات الوصول التالية متوفرة:
أداة تعديل Visual Basic |
المعدّل #C |
التعريف |
---|---|---|
النوع أو عضو يمكن الوصول إليها من قبل أي تعليمات برمجية أخرى في نفس تجميع أو تجميع آخر يشير له. |
||
النوع أو العضو يمكن الوصول إلىهم فقط بواسطة تعليمات برمجية في نفس الفئة. |
||
النوع أو العضو يمكن الوصول إلىهم فقط بواسطة تعليمات برمجية في نفس الفئة أو في فئة مشتقة. |
||
النوع أو عضو يمكن الوصول إليها من قبل أي تعليمات برمجية في نفس التجميع لكن ليس من تجميع آخر. |
||
Protected Friend |
protected internal |
نوع أو عضو يمكن الوصول إلى أية تعليمات برمجية في نفس تجميع أو بواسطة أي الفئة المشتقة في تجميع آخر. |
للمزيد من المعلومات، راجع مستويات الوصول في Visual Basic والمعدلات الوصول (C# البرمجة الدليل).
إنشاء فئات
لإنشاء كائن تحتاج إلى إنشاء مثيل لفئة أو إنشاء مثيل فئة.
Dim sampleObject as New SampleClass()
SampleClass sampleObject = new SampleClass();
بعد إنشاء فئة, يمكنك تعيين قيم إلى الحقول والخصائص الخاصة بمثيل ثم استدعاء أساليب الفئة.
' Set a property value.
sampleObject.SampleProperty = "Sample String"
' Call a method.
sampleObject.SampleMethod()
// Set a property value.
sampleObject.sampleProperty = "Sample String";
// Call a method.
sampleObject.sampleMethod();
لتعين قيم للخصائص أثناء عملية إنشاء مثيل للفئة, إستخدم مُهيآت الكائن:
Dim sampleObject = New SampleClass With
{.FirstProperty = "A", .SecondProperty = "B"}
// Set a property value.
SampleClass sampleObject = new SampleClass
{ FirstProperty = "A", SecondProperty = "B" };
لمزيد من المعلومات، راجع:
Visual Basic
C#
الفئات و الأعضاء الثابتة (مشتركة)
هو عضو في ثابت (المشتركة في Visual Basic) الفئة الخاصية أو إجراء أو حقل مشاركة من قبل الكل المثيلات لفئة ما.
لتعريف عضو ثابت (مشتركة):
Class SampleClass
Public Shared SampleString As String = "Sample String"
End Class
static class SampleClass
{
public static string SampleString = "Sample String";
}
للوصول إلى عضو ثابت (مشترك) ، إستخدم اسم الفئة بدون إنشاء كائن لهذه الفئة:
MsgBox(SampleClass.SampleString)
Console.WriteLine(SampleClass.SampleString);
الفئات (مشتركة) ثابتة في #C و الوحدات النمطية في Visual Basic لديها أعضاء (مشتركة) ثابتة فقط و يتعذر إنشاء مثيل لها. الأعضاء الثابتة (مشتركة) يتعذر لها الوصول إلى خصائص, حقول أو أساليب غير ثابتة (غير المشتركة)
لمزيد من المعلومات، راجع:
Visual Basic
C#
أنواع مجهولة
الأنواع المجهولة تتيح لك إنشاء كائنات دون كتابة تعريف الفئة لنوع البيانات. بدلاً من ذلك، ينشئ المحول البرمجي فئة نيابة عنك. ليس لدى الفئة اسم غير صالح للإستخدام ويحتوي على الخصائص التي حددتها في التصريح للكائن.
لتعريف مثيل من النوع المجهول
' sampleObject is an instance of a simple anonymous type.
Dim sampleObject =
New With {Key .FirstProperty = "A", .SecondProperty = "B"}
// sampleObject is an instance of a simple anonymous type.
var sampleObject =
new { FirstProperty = "A", SecondProperty = "B" };
لمزيد من المعلومات، راجع:
Visual Basic: أنواع مجهول
الوراثة
تمكّنك الوراثة من إنشاء فئات جديدة تعيد إستخدام وتوسّع وتعدّل السلوك الذي تم تعريفه في الفئات الأخرى. الفئة المورثة للأعضاء التي تسمى الفئة الأساسية و الفئة التي ترث هذه الأعضاءالفئة المشتقة. كل الفئات في كل من C# و Visual Basic ضمنيًا يرث من فئة Object التي تدعم هيكل فئة .NET ويوفر الخدمات منخفضة المستوى إلى الكل الفئات.
ملاحظة
لا تدعم اللغات التي تمت ادارتها في .NET Framework التوريث المتعدد, على سبيل المثال: يمكنك تحديد فئة أساسية واحدة للفئة المشتقة.
للتوريث من فئة أساس:
Class DerivedClass
Inherits BaseClass
End Class
class DerivedClass:BaseClass{}
بشكل إفتراضي يمكن وراثة كل الفئات. ومع ذلك، يمكنك تحديد ما إذا ما كانت الفئة غير مستخدمة كفئة أساسية أو إنشاء فئة يمكن إستخدامها كفئة أساسية فقط.
لتعين أنه لا يمكن إستخدام الفئة كفئة أساسية:
NotInheritable Class SampleClass
End Class
public sealed class A { }
لتحديد أنه يمكن إستخدام الفئة كفئة أساسية فقط و يتعذر إنشاء مثيل منها:
MustInherit Class BaseClass
End Class
public abstract class B { }
لمزيد من المعلومات، راجع:
Visual Basic
C#
تجاوز الأعضاء
بشكل افتراضي، تورث الفئة المشتقة كل الأعضاء من الفئة الأساسية الخاصة بها. إذا كنت تريد تغيير السلوك للأعضاء الموروثة, تحتاج إلى يمنعه. أي، يمكنك تعريف تطبيق جديد الأسلوب أو الخاصية أو الحدث في الفئة المشتقة.
يتم إستخدام معدّلات التالية للتحكم في كيفية تجاوز الخصائص و الأساليب:
أداة تعديل Visual Basic |
المعدّل #C |
التعريف |
---|---|---|
يسمح عضو فئة تجاوز في الفئة المشتقة. |
||
تجاوز عضو ظاهري (قابل للتجاوز) المعرّفة في الفئة الأساسية. |
||
غير مدعم |
منع تجاوز العضو في فئة مورثة. |
|
يتطلب من عضو فئة للتجاوز في فئة مكتسبة. |
||
إخفاء عضو تورّث من فئة أساسية |
الواجهات
الواجهات كالفئات مثلاً تقوم بتعريف مجموعة من خصائص والأساليب والأحداث. ولكن بعكس الفئات، لا توفر الواجهات تطبيق. أنها عبارة عن تطبيق بواسطة الفئات ويتم تعريفها على أنها كيان منفصل من الفئات. تمثل الواجهة عقد ينص أن تقوم فئة بتطبيق واجهة بتنفيذ كل وجه من تلك الواجهة تماماً كما تم تعريفها.
لتعريف واجهة:
Public Interface ISampleInterface
Sub DoSomething()
End Interface
interface ISampleInterface
{
void doSomething();
}
لتطبيق واجهة في فئة:
Class SampleClass
Implements ISampleInterface
Sub doSomething
' Method implementation.
End Sub
End Class
class SampleClass : ISampleInterface
{
void ISampleInterface.SampleMethod()
{
// Method implementation.
}
}
لمزيد من المعلومات، راجع:
Visual Basic
C#
عام
الفئات، البنيات ، الواجهات والأساليب في .NET Framework يمكنها نوع المعلمات التي تقوم بتعريف أنواع الكائنات التي يمكن تخزينها أو إستخدامها. المثال الأكثر شيوعاً للعام هو المجموعة ، حيث يمكنك تعيين نوع الكائنات ليتم تخزينها في مجموعة.
لتعريف فئة عامة:
Class SampleGeneric(Of T)
Public Field As T
End Class
Public class SampleGeneric<T>
{
public T Field;
}
لإنشاء مثيل من فئة عامة:
Dim sampleObject As New SampleGeneric(Of String)
sampleObject.Field = "Sample string"
SampleGeneric<string> sampleObject = new SampleGeneric<string>();
sampleObject.Field = "Sample string";
لمزيد من المعلومات، راجع:
المفوضون
التفويض هو نوع يعرّف توقيع الأسلوب و يمكنه أن يوفر مرجع إلى أي أسلوب بتوقيع متوافق. يمكن استدعاء (أو الاتصال بالـ) الأسلوب عن طريق مثيل التفويض. يتم إستخدام التفويضات لتمرير الأساليب كوسيطات إلى أساليب أخرى.
ملاحظة
معالجات الأحداث ليست إلا أساليب يتم استدعاؤها عن طريق تفويضات. لمزيد من المعلومات حول إستخدام التفويضات في معالجة الحدث راجع أحداث و مفوضون.
لإنشاء تفويض:
Delegate Sub SampleDelegate(ByVal str As String)
public delegate void SampleDelegate(string str);
إنشاء مرجع إلى أسلوب الذي يتطابق مع التوقيع المحدد بواسطة المفوض:
Class SampleClass
' Method that matches the SampleDelegate signature.
Sub SampleSub(ByVal str As String)
' Add code here.
End Sub
' Method that instantiates the delegate.
Sub SampleDelegateSub()
Dim sd As SampleDelegate = AddressOf SampleSub
sd("Sample string")
End Sub
End Class
class SampleClass
{
// Method that matches the SampleDelegate signature.
public static void sampleMethod(string message)
{
// Add code here.
}
// Method that instantiates the delegate.
void SampleDelegate()
{
SampleDelegate sd = sampleMethod;
sd("Sample string");
}
}
لمزيد من المعلومات، راجع:
Visual Basic
C#