khaledbelal
02-24-2010, 02:18 PM
بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .
نواصل الآن دروسنا مع ال interfaces ، سنتعرض الآن ولثلاث دروس قادمة عن كيفية عمل فئة أو كلاس يقوم بعمل implement لل interface معين ، في هذا الدرس سنبدأ ب interface المسمى IEnumerable وما هي الفائدة المرجوة وراء ذلك .
بداية أرجو منك أن تركز جيداً في هذا الدرس ، فهذا واحد من الدروس التي ستلاحقنا كثيراً أثناء تطبيق مبادئ Linq .
لنفترض ان لدينا فئة مصفوفة أسماء تحتوي على عدة بيانات بالشكل التالي :
C#:
string[] users = { "Ahmed", "Mohammed" };
vb.net:
Dim users As String() = {"Ahmed", "Mohammed"}
والآن لقراءة محتويات المصفوفة كنا نستخدم الكود التالي باستخدام for - each كما تعلمنا سابقاً :
C#:
foreach (string us in users)
{
Console.WriteLine(us);
}
vb.net:
For Each us As String In users
Console.WriteLine(us)
Next
هذا لو كنا نعتمد على array ، تجد اننا نستخدم دالة للدوران على كافة العناصر ، سنقوم بتوسيع المثال نوعاً ليكون ذلك بالاعتماد على فئة ، سنفترض فئة الموظفين بالشكل التالي :
C#:
public class employee
{
int emp_number;
string emp_name;
}
vb.net:
Public Class employee
Private emp_number As Integer
Private emp_name As String
End Class
وليكن لدينا كلاس آخر يحتوي على بيانات المستخدمين ، حيث ان المستخدم هو عبارة عن مجموعة من الموظفين بالشكل التالي مثلاً :
c#:
public class users
{
employee[] emp = new employee[3];
users()
{
emp[0] = new employee(10, "Ahmed");
emp[1] = new employee(20, "Khaled");
emp[2] = new employee(30, "Ali");
}
}
vb.net:
Public Class users
Private emp As employee() = New employee(2) {}
Private Sub New()
emp(0) = New employee(10, "Ahmed")
emp(1) = New employee(20, "Khaled")
emp(2) = New employee(30, "Ali")
End Sub
End Class
يمكننا استعراض السيارات ايضاً باستخدام for each ايضاً باستخدام جملة كالتالي :
C#:
foreach (employee e in emp)
{
}
vb.net
For Each e As employee In emp
Next
مع كل loop سيتم طباعة عنصر معين ، هذا هو المبدأ الذي سنسعى إليه مع ال IEnumerable .
الشكل الاساسي لل interface المسمى IEnumerable :
C#:
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
vb.net:
Public Interface IEnumerable
Function GetEnumerator() As IEnumerator
End Interface
وكما ترى في المثال السابق ، يقوم بتعريف انترفيس من نوع IEnumerator بالشكل التالي :
C#:
public interface IEnumerator
{
bool MoveNext ();
object Current { get;}
void Reset ();
}
vb.net:
Public Interface IEnumerator
Function MoveNext() As Boolean
ReadOnly Property Current() As Object
Sub Reset()
End Interface
لذا لو كنا نرغب في ان نجعل فئة users تقوم بعمل implements لهذا الانترفيس ، سنضطر لعمل implement للدالة GetEnumerator() ، سيكون ذلك بالشكل التالي :
C#:
public class users:IEnumerable
{
employee[] emp = new employee[4];
users()
{
emp[0] = new employee(10, "Ahmed");
emp[1] = new employee(20, "Khaled");
emp[2] = new employee(30, "Ali");
emp[3] = new employee(40, "Sami");
}
public IEnumerator GetEnumerator()
{
return emp.GetEnumerator();
}
}
vb.net:
Public Class users
Implements IEnumerable
Private emp As employee() = New employee(3) {}
Private Sub New()
emp(0) = New employee(10, "Ahmed")
emp(1) = New employee(20, "Khaled")
emp(2) = New employee(30, "Ali")
emp(3) = New employee(40, "Sami")
End Sub
Public Function GetEnumerator() As IEnumerator
Return emp.GetEnumerator()
End Function
End Class
يمكننا القيام بذلك يدوياً ايضاً بالشكل التالي :
C#:
IEnumerator i = emp.GetEnumerator();
i.MoveNext();
employee myCar = (employee)i.Current;
vb.net:
Dim i As IEnumerator = emp.GetEnumerator()
i.MoveNext()
Dim myCar As employee = DirectCast(i.Current, employee)
- ماذا نستفيد من هذه الطريقة ؟
في الواقع فأي مبرمج لقواعد البيانات يستطيع ان يستنتج العلاقة بسهولة ، إن ما نحن بصدده هنا هو مثال عن فئة تحتوي على مجموعة من البيانات اشبه بقاعدة بيانات ، واصبح باستطاعنا الآن القراءة منها والتنقل فيها باستخدام moveNext .
استخدام yield
بدلاً من الكود السابق قم بكتابة الكود التالي :
public IEnumerator GetEnumerator()
{
yield return emp[0];
yield return emp[1];
yield return emp[2];
yield break;
}
في هذه الحالة ومع اول استدعاء للدالة سيتم اعادة القيمة الأولى ، ثم الثانية فالثالثة وهكذا حتى نصل إلى yield break .
نستعرف على واحدة من أهم الاستخدامات الفعلية عندما نصل إلى Linq ، وحتى ذلك الحين أتمنى ألا تغفل عينك عن هذا الانترفيس .
والله الموفق ...
والسلام عليكم ورحمة الله وبركاته .
السلام عليكم ورحمة الله وبركاته .
نواصل الآن دروسنا مع ال interfaces ، سنتعرض الآن ولثلاث دروس قادمة عن كيفية عمل فئة أو كلاس يقوم بعمل implement لل interface معين ، في هذا الدرس سنبدأ ب interface المسمى IEnumerable وما هي الفائدة المرجوة وراء ذلك .
بداية أرجو منك أن تركز جيداً في هذا الدرس ، فهذا واحد من الدروس التي ستلاحقنا كثيراً أثناء تطبيق مبادئ Linq .
لنفترض ان لدينا فئة مصفوفة أسماء تحتوي على عدة بيانات بالشكل التالي :
C#:
string[] users = { "Ahmed", "Mohammed" };
vb.net:
Dim users As String() = {"Ahmed", "Mohammed"}
والآن لقراءة محتويات المصفوفة كنا نستخدم الكود التالي باستخدام for - each كما تعلمنا سابقاً :
C#:
foreach (string us in users)
{
Console.WriteLine(us);
}
vb.net:
For Each us As String In users
Console.WriteLine(us)
Next
هذا لو كنا نعتمد على array ، تجد اننا نستخدم دالة للدوران على كافة العناصر ، سنقوم بتوسيع المثال نوعاً ليكون ذلك بالاعتماد على فئة ، سنفترض فئة الموظفين بالشكل التالي :
C#:
public class employee
{
int emp_number;
string emp_name;
}
vb.net:
Public Class employee
Private emp_number As Integer
Private emp_name As String
End Class
وليكن لدينا كلاس آخر يحتوي على بيانات المستخدمين ، حيث ان المستخدم هو عبارة عن مجموعة من الموظفين بالشكل التالي مثلاً :
c#:
public class users
{
employee[] emp = new employee[3];
users()
{
emp[0] = new employee(10, "Ahmed");
emp[1] = new employee(20, "Khaled");
emp[2] = new employee(30, "Ali");
}
}
vb.net:
Public Class users
Private emp As employee() = New employee(2) {}
Private Sub New()
emp(0) = New employee(10, "Ahmed")
emp(1) = New employee(20, "Khaled")
emp(2) = New employee(30, "Ali")
End Sub
End Class
يمكننا استعراض السيارات ايضاً باستخدام for each ايضاً باستخدام جملة كالتالي :
C#:
foreach (employee e in emp)
{
}
vb.net
For Each e As employee In emp
Next
مع كل loop سيتم طباعة عنصر معين ، هذا هو المبدأ الذي سنسعى إليه مع ال IEnumerable .
الشكل الاساسي لل interface المسمى IEnumerable :
C#:
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
vb.net:
Public Interface IEnumerable
Function GetEnumerator() As IEnumerator
End Interface
وكما ترى في المثال السابق ، يقوم بتعريف انترفيس من نوع IEnumerator بالشكل التالي :
C#:
public interface IEnumerator
{
bool MoveNext ();
object Current { get;}
void Reset ();
}
vb.net:
Public Interface IEnumerator
Function MoveNext() As Boolean
ReadOnly Property Current() As Object
Sub Reset()
End Interface
لذا لو كنا نرغب في ان نجعل فئة users تقوم بعمل implements لهذا الانترفيس ، سنضطر لعمل implement للدالة GetEnumerator() ، سيكون ذلك بالشكل التالي :
C#:
public class users:IEnumerable
{
employee[] emp = new employee[4];
users()
{
emp[0] = new employee(10, "Ahmed");
emp[1] = new employee(20, "Khaled");
emp[2] = new employee(30, "Ali");
emp[3] = new employee(40, "Sami");
}
public IEnumerator GetEnumerator()
{
return emp.GetEnumerator();
}
}
vb.net:
Public Class users
Implements IEnumerable
Private emp As employee() = New employee(3) {}
Private Sub New()
emp(0) = New employee(10, "Ahmed")
emp(1) = New employee(20, "Khaled")
emp(2) = New employee(30, "Ali")
emp(3) = New employee(40, "Sami")
End Sub
Public Function GetEnumerator() As IEnumerator
Return emp.GetEnumerator()
End Function
End Class
يمكننا القيام بذلك يدوياً ايضاً بالشكل التالي :
C#:
IEnumerator i = emp.GetEnumerator();
i.MoveNext();
employee myCar = (employee)i.Current;
vb.net:
Dim i As IEnumerator = emp.GetEnumerator()
i.MoveNext()
Dim myCar As employee = DirectCast(i.Current, employee)
- ماذا نستفيد من هذه الطريقة ؟
في الواقع فأي مبرمج لقواعد البيانات يستطيع ان يستنتج العلاقة بسهولة ، إن ما نحن بصدده هنا هو مثال عن فئة تحتوي على مجموعة من البيانات اشبه بقاعدة بيانات ، واصبح باستطاعنا الآن القراءة منها والتنقل فيها باستخدام moveNext .
استخدام yield
بدلاً من الكود السابق قم بكتابة الكود التالي :
public IEnumerator GetEnumerator()
{
yield return emp[0];
yield return emp[1];
yield return emp[2];
yield break;
}
في هذه الحالة ومع اول استدعاء للدالة سيتم اعادة القيمة الأولى ، ثم الثانية فالثالثة وهكذا حتى نصل إلى yield break .
نستعرف على واحدة من أهم الاستخدامات الفعلية عندما نصل إلى Linq ، وحتى ذلك الحين أتمنى ألا تغفل عينك عن هذا الانترفيس .
والله الموفق ...
والسلام عليكم ورحمة الله وبركاته .