المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : الدرس السادس والعشرون : ال Interfaces دورة .net 2008


khaledbelal
02-24-2010, 01:44 PM
السلام عليكم ورحمة الله وبركاته .

تعريف ال 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:

public class BMW: ITruck, ICar
{
void ICar.move()
{
// do something.
}
void ITruck.move()
{
// do something.
}
}
وبعد عمل object من الكلاس BMW ، يمكن تحديد اي واحدة من الدالتين يتم استدعاءها بالشكل التالي :

C#:


BMW ahmedCar=new BMW();
ICar temp= (ICar)ahmedCar;
temp.move();
vb.net:

Dim ahmedCar As New BMW()
Dim temp As ICar = DirectCast(ahmedCar, ICar)
temp.move()