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