منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : الدرس السادس والعشرون - ال Interfaces
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
كاتب الموضوع : أحمد جمال

بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .

تعريف ال Interface :
ال interface هو abstract class يحتوي على abstract mehods and members يمكن عمل نسخة منه باستخدام بمفهوم implementation بدلاً من inhiritancae ، كما يتميز بامكانية عمل implement لاكثر من interface في المرة الواحدة وهو البديل عن مفهوم multiple inhiritance .

يمكن تعريف interface بالشكل التالي مثلاً :

C#:


كود :
public interface ICar
{
int carMaxSpeed{get;set;}
void AddItem(string Item);
}
vb.net:


كود :
Public Interface ICar
Property carMaxSpeed() As Integer
Sub AddItem(ByVal Item As String)

End Interface
لا تنسى ان بامكانك اشتقاق interface من آخر بالشكل التالي مثلاً :

C#:


كود :
public interface ICar:IDisposable
{
int carMaxSpeed{get;set;}
void AddItem(string Item);
}
VB.net:


كود :
Public Interface ICar
Inherits IDisposable
Property carMaxSpeed() As Integer
Sub AddItem(ByVal Item As String)

End Interface
ولعمل implements لاي interface نقوم بكتابة الكود التالي :

C#:


كود :
public class BMW : Car
{

}

public class BMW2 : Car, Truck
{

}
VB.net:


كود :
Public Class BMW
Implements Car

End Class

Public Class BMW2
Implements Car, Truck

End Class
الآن يمكنك اعادة كتابة الدوال الموجودة . اضافة دوال جديدة ، ومن ثم استخدام الفئة كما قمنا بذلك قبلاً .
don't do with interface :

- بداية ، ال Interface لا يمكن عمل اي Object منه .
لذا فمثل هذه الجملة خاطئة :

C#:

كود :
ICar x=new ICar();
vb.net:

كود :
Dim x As New ICar()
- لا يمكن تعريف متغير عادي في ال interface ، لذا مثل هذه الجملة داخل ال interface خاطئة :

c#:

كود :
int number;
vb.net:

كود :
Dim number as integer
البديل ، هو عمل خاصية set و get بالشكل التالي :

C#:

كود :
int x {set;get;}
vb.net:

كود :
Private Property x() As Integer
Get
End Get
Set
End Set
End Property
- بالطبع لا يمكنك كتابة أي سطر كود داخل ال interface .
- كما لا يمكن عمل constructor لل interface .
كاتب المشاركة : أحمد جمال

Name Clashes

احياناً ما يقوم class او struct ما بعمل implements لاكثر من interface ، وربما يحدث مشاكل في تشابه الأسماء ، لنفترض المثال التالي :

C#:


كود :
public interface ICar
{
void move();
}
public interface ITruck
{
void move();
}
public class BMW: ITruck, ICar
{
}
vb.net:


كود :
Public Interface ICar
Sub move()
End Interface
Public Interface ITruck
Sub move()
End Interface
Public Class BMW
Implements ITruck
Implements ICar

End Class
ربما لن تجد مشكلة فيما لو قمت بعمل implementation للدالة move في الكلاس الجديد BMW :

C#:


كود :
public class BMW: ITruck, ICar
{
void move()
{
// do something.
}
}
vb.net:


كود :
Public Class BMW
Implements ITruck
Implements ICar

Private Sub move()
' do something.
End Sub
End Class
ولكن ماذا لو أردت عمل implementation للدالة move من car واخرى للدالة move من truck ، نقوم بذلك بالشكل التالي :

C#:


كود :
public class BMW: ITruck, ICar
{
void ICar.move()
{
// do something.
}
void ITruck.move()
{
// do something.
}
}
vb.net:


كود :
BMW ahmedCar=new BMW();
ICar temp= (ICar)ahmedCar;
temp.move();
وبعد عمل object من الكلاس BMW ، يمكن تحديد اي واحدة من الدالتين يتم استدعاءها بالشكل التالي :

C#:


كود :
Dim ahmedCar As New BMW()
Dim temp As ICar = DirectCast(ahmedCar, ICar)
temp.move()
vb.net:


كود :
Dim ahmedCar As New BMW()
Dim temp As ICar = DirectCast(ahmedCar, ICar)
temp.move()