سفارش تبلیغ
صبا ویژن
دانش را بجویید که آن رشته میان شما وخداوند است . [پیامبر خدا صلی الله علیه و آله]

علمی ،آموزشی،تحقیقاتی

مبحث overloading :

گاهی از اوقات لازم است تا نگارش های مختلفی از یک تابع داشته باشیم. برای مثال تعریف سه تابع با یک نام اما با آرگومان های مختلف. به این نوع توابع و یا متدها اصطلاحا Overloaded Methods می گویند . ( فکر کنم آن را سربارگذاری توابع ترجمه کرده اند! ) برای مثال :

void myMethod(int p1);
void myMethod(int p1, int p2);
void myMethod(int p1, string s1);

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آن را درابتدا ex18 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :

using System;

namespace ex18
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
writeIT();

writeIT(12);

Console.ReadLine();
}

public static void writeIT()
{
Console.WriteLine(” writeIT() Ver.” );
}

public static void writeIT(int intI)
{
Console.WriteLine(” writeIT(intI) Ver. = ” + intI );
}

}
}

توضیحاتی در مورد کد فوق :

?- نحوه ی تعریف دو تابع با یک نام را ملاحظه می نمایید. این کار در زبان سی ممنوع است!
?- کامپایلر به صورت هوشمند بر اساس نوع و تعداد آرگومان های ورودی ، ورژن مناسب را انتخاب و اجرا می کند.

نمونه ی ضعیفی از این بحث در وی بی ? به صورت تعریف توابعی با پارامترهای Optional وجود داشت .

مباحث تکمیلی آرایه ها (آرایه های چند بعدی):

آرایه های معمولی (یک بعدی) را می توان یک ردیف با تعدادی خانه خالی آماده ی پر شدن در نظر گرفت. آرایه ی دوبعدی را می توان مانند یک جدول تشکلیل شده از ردیف ها و ستون ها در نظر گرفت و الی آخر…
سی شارپ دو نوع آرایه ی چند بعدی را پشتیبانی می کند : rectangular and jagged
در یک آرایه ی rectangular هر ردیف ، طولش با ردیف بعدی یکی است. آرایه ی jagged در حقیقت آرایه ایی از آرایه ها است ، بنابراین هر کدام از آن ها می تواند طول مختلفی داشته باشد.

تعریف یک آرایه ی دوبعدی به صورت زیر است :

type [,] array-name

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آن را درابتدا ex19 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :

using System;

namespace ex19
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
const int rows = 4;
const int columns = 3;
// declare a 4×3 integer array
int[,] rectangularArray = new int[rows, columns];
// populate the array
for (int i = 0;i < rows;i++)
{
for (int j = 0;j {
rectangularArray[i,j] = i+j;
}
}
// report the contents of the array
for (int i = 0;i < rows;i++)
{
for (int j = 0;j
{
Console.WriteLine(”rectangularArray[{0},{1}] = {2}”,
i,j,rectangularArray[i,j]);
}
}

Console.ReadLine();
}
}
}


توضیحاتی در مورد کد فوق :
?- نحوه ی تعریف ، مقدار دهی اولیه و استفاده از آرایه های دو بعدی را در مثال فوق ملاحظه می نمایید.
?- در یک آرایه ی دوبعدی محل قرار گیری ردیف ها و ستون ها برای مثال به صورت زیر است :

new int[rows, columns]-

استفاده از آرایه های چند بعدی :

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آن را درابتدا ex20 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :

using System;

namespace ex20
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
const int rows = 4;
const int columns = 3;
// imply a 4×3 array
int[,] rectangularArray =
{
{0,1,2},
{3,4,5},
{6,7,8},
{9,10,11}
};
for (int i = 0;i < rows;i++)
{
for (int j = 0;j {
Console.WriteLine(”rectangularArray[{0},{1}] = {2}”,
i,j,rectangularArray[i,j]);
}
}
}
}
}

توضیحاتی در مورد کد فوق :
?- در حقیقت مثال فوق تعریف آرایه ایی از آرایه ها بود.
?- چون مقدار دهی اولیه به صورت واضحی انجام شده نیازی به ذکر ابعاد آرایه به صورت صحیح وجود نداشت

 

 آرایه ای از آرایه ها است و هما ن طور
که ذکر شد لزومی ندارد که هر ردیف آن با ردیف بعدی هم طول باشد .
هنگام تعریف این نوع آرایه شما تعداد ردیف ها را مشخص می نمایید. هر ردیف
یک آرایه را نگه داری می کند. در اینجا هر آرایه باید تعریف شود.
روش تعریف Jagged array به صورت زیر است

type [] []…


در اینجا
تعداد براکت ها بیانگر ابعاد آرایه می باشد. برای مثال آرایه ی زیر دو
بعدی است :

int [] [] myJaggedArray;

و
برای مثال برای دسترسی به پنجمین عنصر آرایه ی سوم به صورت زیر عمل می
شود :

myJaggedArray[2][4]

مثال : یک
برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آن را
درابتدا ex21 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :

using System;

namespace ex21

{
class Class1
{
[STAThread]
static void
Main(string[] args)
{

const int rows = 4;
// declare
the jagged array as 4 rows high
int[][] jaggedArray = new
int[rows][];
// the first row has 5 elements
jaggedArray[0]
= new int[5];
// a row with 2 elements
jaggedArray[1] = new
int[2];
// a row with 3 elements
jaggedArray[2] = new
int[3];
// the last row has 5 elements
jaggedArray[3] = new
int[5];
// Fill some (but not all) elements of the rows

jaggedArray[0][3] = 15;
jaggedArray[1][1] = 12;

jaggedArray[2][1] = 9;
jaggedArray[2][2] = 99;

jaggedArray[3][0] = 10;
jaggedArray[3][1] = 11;

jaggedArray[3][2] = 12;
jaggedArray[3][3] = 13;

jaggedArray[3][4] = 14;
for (int i = 0;i < 5; i++)
{

Console.WriteLine(”jaggedArray[0][{0}] = {1}”,

i,jaggedArray[0][i]);
}
for (int i = 0;i < 2; i++)

{
Console.WriteLine(”jaggedArray[1][{0}] = {1}”,

i,jaggedArray[1][i]);
}
for (int i = 0;i < 3; i++)

{
Console.WriteLine(”jaggedArray[2][{0}] = {1}”,

i,jaggedArray[2][i]);
}
for (int i = 0;i < 5; i++)

{
Console.WriteLine(”jaggedArray[3][{0}] = {1}”,

i,jaggedArray[3][i]);
}

Console.ReadLine();

}
}
}

توضیحاتی در مورد کد فوق :

هنگام کار با آرایه های rectangular برای درسترسی به اعضا به
صورت زیر عمل می شد :

rectangularArrayrectangularArray[i,j]

اما در این جا بدین صورت است :

jaggedArray[3][i]

استفاده
از System.Array :

دات نت فریم ورک کلاسی را معرفی کرده است به نام
Array. توسط این کلاس کار با آرایه ها و اعمال روی آن ها برای مثال
سورت کردن و غیره به شدت ساده می شود .

مثال : یک برنامه ی سی
شارپ جدید console را در VS.NET باز کنید و نام آن را درابتدا ex22
انتخاب نمایید. سپس کد زیر را درون آن بنویسید :

using System;

namespace ex22

{
class Class1
{
public static void
PrintMyArray([] theArray)
{
foreach ( obj in
theArray)
{
Console.WriteLine(”Value: {0}”, obj);
}

Console.WriteLine(”\n”);
}

[STAThread]
static
void Main(string[] args)
{
String[] myArray = {
“Who”,
“is”, “John”, “Galt”
};
PrintMyArray(myArray);

Array.Reverse(myArray);
PrintMyArray(myArray);
String[]
myOtherArray = {
“We”, “Hold”, “These”, “Truths”,
“To”,
“Be”, “Self”, “Evident” };

PrintMyArray(myOtherArray);

Array.Sort(myOtherArray);
PrintMyArray(myOtherArray);

Console.ReadLine() ;

}
}
}

توضیحاتی در مورد کد فوق :
از دو متد Sort و Reverse در
این جا برای سورت کردن و نمایش آرایه به ترتیب معکوس (از انتها به
ابتدا) استفاده گردیده است.

تعریف آرایه های دینامیک در سی
شارپ :

یکی از مشکلاتی که با آرایه های معمول وجود دارد این است که
قبل از هر کاری باید طول آْ ن ها را مشخص کرد. گاهی از اوقات ما
دقیقا نمی دانیم برنامه چه تعداد عضو را دریافت می کند تا آرایه ای از
پیش تعریف شده با همان تعداد عضو ایجاد کنیم. برای حل این مشکل از کلاس
ArrayList تعریف شده در دات نت فریم ورک می توان استفاده کرد.

هنگام استفاده از ArrayList نیازی به دانستن تعداد اعضایی که
باید اضافه شوند نمی باشد و با استفاده از متد Add آن به سادگی می توان
اعضاء را به آن اضافه نمود . تعدادی از خواص و متدهای این کلاس به صورت
زیر هستند :

Adapter , FixedSize , ReadOnly , Repeat ,
Synchronized , Capacity,Count , IsFixedSize , IsReadOnly ,
IsSynchronized , Item , SyncRoot , Add , AddRange , BinarySearch ,
Clear , Clone , Contains , CopyTo , GetEnumerator , GetRange ,
IndexOf , Insert , InsertRange , LastIndexOf , Remove , RemoveAt ,
RemoveRange , Reverse , SetRange , Sort , ToArray , TrimToSize

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید
و نام آن را درابتدا ex23 انتخاب نمایید. سپس کد زیر را درون آن
بنویسید :

using System;
using
System.Collections;

namespace ex23
{
// a simple
class to store in the array
public class Employee
{

public Employee(int empID)
{
this.empID = empID;
}

public override string ToString( )
{
return
empID.ToString( );
}
public int EmpID
{
get
{

return empID;
}
set
{
empID = value;
}
}

private int empID;
}

class Class1
{

[STAThread]
static void Main(string[] args)
{

ArrayList empArray = new ArrayList( );
ArrayList
intArray = new ArrayList( );
// populate the array
for (int
i = 0;i<5;i++)
{
empArray.Add(new Employee(i+100));

intArray.Add(i*5);
}
// print all the contents
for
(int i = 0;i
{
Console.Write(”{0} “,
intArray[i].ToString( ));
}
Console.WriteLine(”\n”);
//
print all the contents of the button array
for (int i =
0;i
{
Console.Write(”{0} “,
empArray[i].ToString( ));
}
Console.WriteLine(”\n”);

Console.WriteLine(”empArray.Capacity: {0}”,

empArray.Capacity);

Console.ReadLine();

}
}

}

توضیحاتی در مورد کد فوق :

?- با کلمه ی
کلیدی override در قسمت های بعدی آشنا خواهیم شد.
?- برای استفاده
از ArrayList لازم بود تا فضای نامی را که این کلاس در آن تعریف شده
است ، به برنامه اضافه کرد.
?- در مثال فوق نحوه ی تعریف دو کلاس
را در یک فضای نام مشاهده می نمایید.
?- نحوه ی تعریف و مقدار دهی ArrayList و هم
چنین استفاده از خواص آن در مثال فوق بررسی شده است

هر کدی در سی شارپ قسمتی از یک کلاس می باشد و ترکیب تمام خواص و متدهای موجود در یک کلاس یک نوع داده ی جدید تعریف شده از طرف ما را پدید می آورد. هر متغیری که از کلاس ساخته شود ، شیء نامیده می شود و یک کپی منحصر به فرد است. برای مثال برنامه ی زیر را درنظر بگیرید :

using System;

class Data
{
public int x;
}
class App
{
public static void Main()
{
Data d1 = new Data();
d1.x = 1;
Data d2 = new Data();
d2.x = 2;
Console.WriteLine(”d1.x = {0}”, d1.x);
Console.WriteLine(”d2.x = {0}”, d2.x);
}
}

در این جا کلاس Data تعریف شده است و دارای یک عضو به نام x می باشد. به این نوع داده در کلاس فیلد گفته می شود و هنگامی که به صورت public معرفی می شود یعنی خارج از کلاس نیز قابل دسترسی است. در کد بالا دو متغیر از کلاس تعریف و مقدار دهی اولیه شده اند. خروجی برنامه به صورت زیر است :

d1.x = 1
d2.x = 2

دلیل این خروجی آن است که هر instance (نمونه) از کلاس منحصر بفرد است و در این جا نمی توان انتظار داشت که هر دو خروجی یکی شوند.

برای مقدار دهی اولیه متغیرهایی که به صورت فیلد تعریف می شوند ، بهتر است مقدار دهی آن ها را در سازنده ی کلاس (constructor) انجام دهیم.

class Data
{
public int x;
public Data(){x = 99;}
}

همان طور که پیشتر نیز ذکر شد ، متدی که هم نام کلاس است ، سازنده نام می گیرد. یک کلاس می تواند بیش از یک سازنده داشته باشد. برای مثال :

class Data
{
public int x;
private Data(){}
public Data(int y){x = y;}
public Data(int y, int z){x = y + z;}
}

از آنجایی که  سازنده ی بدون پارامتر ذکر شده در کد فوق private تعریف شده است بنابراین خارج از کلاس دیگر قابل دسترسی نمی باشد . بنابراین کدی خارج از کلاس ، تنها می تواند از دو سازنده ی دیگر استفاده کند. برای مثال تعریف دو متغیر جدید از این کلاس به صورت زیر می باشد :

Data d1 = new Data(44);
Data d2 = new Data(22, 33);

سی شارپ به شما اجازه می دهد تا سازنده ها را در یک کلاس توسط کلمه ی کلیدی this نیز فراخوانی کنید یعنی بجای ذکر نام متد سازنده از کلمه ی this استفاده شود ( در خود کلاس ) .

اگر می خواهید متغیری را بین نمونه (instance) های مختلف یک کلاس به اشتراک بگذارید کلمه ی کلیدی static وارد صحنه می شود. به مثال زیر توجه کنید :

using System;

class Counted
{
public static int count = 0;
public Counted()
{
count++;
}
public int GetInstanceCount()
{
return count;
}
}
class App
{
public static void Main()
{
Counted d1 = new Counted();
Console.WriteLine(”current total {0}”, d1.GetInstanceCount());
Counted d2 = new Counted();
Console.WriteLine(”current total {0}”, d2.GetInstanceCount());
Console.WriteLine(”total {0}”, Counted.count);
}
}

باید خاطر نشان کرد که متغیرهای استاتیک توسط نمونه های کلاس قابل دستیابی نیستند و فقط درون کلاس به شکل زیر می توان از آْن ها استفاده کرد :

.

در مثال فوق دو نمونه از کلاس Counted تعریف شده است. با هر بار فراخوانی کلاس ، خودبخود سازنده اجرا شده و یک عدد به این شمارشگر استاتیک اضافه می شود. همان طور که ذکر شد، برای این که بتوان به این متغیر استاتیک در خارج از کد دسترسی پیدا کرد یک متد غیر استاتیک تعریف شده است.

در مثال فوق تابع GetInstanceCount تنها یک عدد را بر می گرداند. در برنامه نویسی شیء گرا مرسوم است که در این حالت به جای توابع از خواص استفاده شود که به اندازه ی کافی در مورد آن ها در قسمت های قبل توضیح داده شد. در این صورت تعریف فوق به صورت زیر در می آید :

class Counted
{
public static int x = 0;
public Counted()
{
x++;
}
public int InstanceCount // property
{
get{return x;}
}
}

و در این صورت قسمت بعدی کد به صورت زیر اصلاح می شود (فراخوانی خواص ، بدون ذکر پرانتزها بعد از نام آن ها صورت می گیرد):

Counted d1 = new Counted();
Console.WriteLine(”current total {0}”, d1.InstanceCount);
Counted d2 = new Counted();
Console.WriteLine(”current total {0}”, d2.InstanceCount);

اگر یک خاصیت هم خواندنی و هم نوشتنی باشد به صورت زیر تعریف می شود :

private string name;
public string Name
{
get{return name;}
set{name = value;}
}

فیلدهای پابلیک را می توان خواند و یا تغییر داد. اگر لازم باشد تا کاربر نتواند آن ها را تغییر دهد می توان از کلمه ی کلیدی readonly قبل از تعریف آن ها استفاده کرد. مثال :

class Data
{
public readonly int x = 42;
}



مژده فرجی ::: سه شنبه 87/10/24::: ساعت 3:37 عصر

>> بازدیدهای وبلاگ <<
بازدید امروز: 4


بازدید دیروز: 4


کل بازدید :59298
 
 >>اوقات شرعی <<
 
>> درباره خودم<<
مدیر وبلاگ : مژده فرجی[85]
نویسندگان وبلاگ :
سمانه طالبی (@)[0]

مژده فرجی (@)[0]


 
 
>>موسیقی وبلاگ<<
 
>>اشتراک در خبرنامه<<
 
 
>>طراح قالب<<