Make your own free website on Tripod.com

دروس مرتبط

 

  صفحه اصلی > مفاهیم کلی شی گرایی > انديكسرها در #C

   

 ارث‌بري كلاس‌ها

چند ريختي (Polymorphism)

> واسطها (Interfaces)

          مقدماتی

          پیشرفته

انديكسرها در #C

 
 

انديكسرها در C# (Indexers)

در اين درس با انديكسرها در C# آشنا مي‌شويم. اهداف اين درس به شرح زير مي‌باشند :

      پياده‌سازي انديكسر

      سرريزي انديكسرها (Overload)

      درك چگونگي پياده‌سازي انديكسرهاي چند پارامتري

  

انديكسرها

انديكسرها مفهومي بسيار ساده در زبان C# هستند. با استفاده از آنها مي‌توانيد از كلاس خود همانند يك آرايه استفاده كنيد. در داخل كلاس مجموعه‌اي از مقادير را به هر طريقي كه مورد نظرتان هست مديريت كنيد. اين اشياؤ مي‌توانند شامل مجموعه‌اي از اعضاي كلاس، يك آرايه ديگر، و يا مجموعه‌اي از ساختارهاي پيچيده داده‌اي باشند، جدا از پياده‌سازي داخلي كلاس، داده‌هاي اين ساختارها از طريق استفاده از انديكسرها قابل دسترسي هستند. به مثالي در اين زمينه توجه كنيد :

ابتدای صفحهF

مثال 11-1 : نمونه‌اي از يك انديكسر

using System;

/// <summary>

/// مثالي ساده از يك انديكسر

/// </summary>

class IntIndexer

{

private string[] myData;

public IntIndexer(int size)

{

myData = new string[size];

for (int i=0; i < size; i++)

{

myData[i] = "empty";

}

}

public string this[int pos]

{

get

{

return myData[pos];

}

set

{

myData[pos] = value;

}

}

static void Main(string[] args)

{

int size = 10;

IntIndexer myInd = new IntIndexer(size);

myInd[9] = "Some Value";

myInd[3] = "Another Value";

myInd[5] = "Any Value";

Console.WriteLine("\nIndexer Output\n");

for (int i=0; i < size; i++)

{

Console.WriteLine("myInd[{0}]: {1}", i, myInd[i]);

}

}

}

مثال 11-1 نحوه پياده‌سازي انديكسر را نشان مي‌دهد. كلاس IntIndexer داراي آراية رشته‌اي بنام myData مي‌باشد. اين آرايه، عنصري خصوصي (private) است و كاربران خارجي (external users) نمي‌توانند به آن دسترسي داشته باشند. اين آرايه درون سازندة (constructor) كلاس تخصيص‌دهي مي‌گردد كه در آن پارامتر size از نوع int دريافت مي‌شود، از آرايه myData نمونه‌اي جديد ايجاد مي‌گردد، سپس هر يك از المانهاي آن با كلمه "empty" مقدار‌دهي مي‌گردد.

عضو بعدي كلاس، انديكسر است كه بوسيلة كلمه كليدي this و دو براكت تعريف شده است، this[int pos]. اين انديكسر پارامتر موقعيتي pos را دريافت مي‌نمايد. همانطور كه حتماً تا كنون دريافته‌ايد پياده‌سازي انديكسر بسيار شبيه به پياده‌سازي يك ويژگي (property) است. انديكسر نيز داراي accessor هاي set و get است كه دقيقاً همانند property عمل مي‌كنند. همانطور كه در اعلان اين انديكسر نيز مشاهده مي‌شود، متغيري از نوع رشته‌اي را باز مي‌گرداند.

در متد Main() شيء جديدي از IntIndexer ايجاد شده است و مقاديري به آن افزوده مي‌شود و سپس نتايج چاپ مي‌گردند. خروجي اين برنامه به شكل زير است :

Indexer Output

myInd[0]: empty

myInd[1]: empty

myInd[2]: empty

myInd[3]: Another Value

myInd[4]: empty

myInd[5]: Any Value

myInd[6]: empty

myInd[7]: empty

myInd[8]: empty

myInd[9]: Some Value

استفاده از integer جهت دسترسي به آرايه‌ها در اغلب زبانهاي برنامه‌سازي رايج است ولي زبان  C# چيزي فراتر از آنرا نيز پشتيباني مي‌كند. در C# انديكسرها را مي‌توان با چندين پارامتر تعريف كرد و هر پارامتر مي‌تواند از نوع خاصي باشد. پارامتر‌هاي مختلف بوسيلة كاما از يكديگر جدا مي‌شوند. پارامترهاي مجاز براي انديكسر عبارتند از : integer، enum و string. علاوه بر آن، انديكسرها قابل سرريزي (Overload) هستند. در مثال 2-11 تغييراتي در مثال قبل ايجاد كرده‌ايم تا برنامه قابليت دريافت انديكسرهاي سرريز شده را نيز داشته باشد.

 ابتدای صفحهF

سرريزي انديكسرها

مثال 2-11 : انديكسرهاي سرريز شده (Overloaded Indexers)

using System;

/// <summary>

/// پياده‌سازي انديكسرهاي سرريز شده

/// </summary>

class OvrIndexer

{

private string[] myData;

private int arrSize;

 

public OvrIndexer(int size)

{

arrSize = size;

myData = new string[size];

for (int i=0; i < size; i++)

{

myData[i] = "empty";

}//end of for

}//end of constructor

 

public string this[int pos]

{

get

{

return myData[pos];

}

set

{

myData[pos] = value;

}

}//end of indexer

 

public string this[string data]

{

get

{

int count = 0;

for (int i=0; i < arrSize; i++)

{

if (myData[i] == data)

{

count++;

}//end of if

}//end of for

return count.ToString();

}//end of get

set

{

for (int i=0; i < arrSize; i++)

{

if (myData[i] == data)

{

myData[i] = value;

}//end of if

}//end of for

}//end of set

}//end of overloaded indexer

 

static void Main(string[] args)

{

int size = 10;

 

OvrIndexer myInd = new OvrIndexer(size);

myInd[9] = "Some Value";

myInd[3] = "Another Value";

myInd[5] = "Any Value";

myInd["empty"] = "no value";

Console.WriteLine("\nIndexer Output\n");

for (int i=0; i < size; i++)

{

Console.WriteLine("myInd[{0}]: {1}", i, myInd[i]);

}//end of for

Console.WriteLine("\nNumber of \"no value\" entries: {0}", myInd["no value"]);

}//end of Main()

}//end of class

مثال 2-11 نحوه سرريز كردن انديكسر را نشان مي‌دهد. اولين انديكسر كه داراي پارامتري از نوع int تحت عنوان pos است دقيقاً مشابه مثال 1-11 است ولي در اينجا انديكسر جديدي نيز وجود دارد كه پارامتري از نوع string دريافت مي‌كند. get accessor انديكسر جديد رشته‌اي را برمي‌گرداند كه نمايشي از تعداد آيتمهايي است كه با پارامتر مقداري data مطابقت مي‌كند. set accessor مقدار هر يك از مقادير ورودي آرايه را كه مقدارش با پارامتر data مطابقت نمايد را به مقداري كه به انديكسر تخصيص داده مي‌شود، تغيير مي‌دهد.

رفتار (behavior) انديكسر سرريز شده كه پارامتري از نوع string دريافت مي‌كند، در متد Main() نشان داده شده است. در اينجا set accessor مقدار "No value" را به تمام اعضاي كلاس myInd كه مقدارشان برابر با "empty" بوده است، تخصيص مي‌دهد. اين accessor از دستور زير استفاده نموده است : myInd["empty"] = "No value" . پس از اينكه تمامي اعضاي كلاس myInd چاپ شدند، تعداد اعضايي كه حاوي "No value" بوده‌اند نيز نمايش داده مي‌شوند. اين امر با استفاده از دستور زير در get accessor روي مي‌دهد : myInd["No value"]. خروجي برنامه بشكل زير است :

Indexer Output

myInd[0]: no value

myInd[1]: no value

myInd[2]: no value

myInd[3]: Another Value

myInd[4]: no value

myInd[5]: Any Value

myInd[6]: no value

myInd[7]: no value

myInd[8]: no value

myInd[9]: Some Value

Number of "no value" entries: 7

 

 ابتدای صفحهF

علت همزيستي هر دو انديكسر در مثال 2-11 در يك كلاس مشابه، تفاوت اثرگذاري و فعاليت آنهاست. اثرگذاري و تفاوت انديكسرها از تعداد و نوع پارامترهاي موجود در ليست پارامترهاي انديكسر مشخص مي‌گردد. در هنگام استفاده از انديكسرها نيز، كلاس با استفاده از تعداد و نوع پارامترهاي انديكسرها، مي‌تواند تشخيص دهد كه در يك فراخواني از كدام انديكسر بايد استفاده نمايد. نمونه‌اي از پياده‌سازي انديكسري با چند نوع پارامتر در زير آورده شده است :

public object this[int param1, ..., int paramN]

{

get

{

// process and return some class data

}

set

{

// process and assign some class data

}

}

خلاصه :

هم اكنون شما با انديكسرها و نحوة پياده‌سازي آنها آشنا شده‌ايد. با استفاده از انديكسرها مي‌توان به عناصر يك كلاس همانند يك آرايه دسترسي پيدا كرد. در اين مبحث انديكسرهاي سرريز شده و چند پارامتري نيز مورد بررسي قرار گرفتند.

ابتدای صفحهF  

Back

  صفحه اصلی
    C# آموزش
    مفاهیم شی گرایی
    برنامه های نمونه
    کار با محیط
    معرفی کتاب
    نقشه سایت
    درباره ما
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
                               

[صفحه اصلی] [آموزش #C] [مفاهیم شی گرایی] [برنامه های نمونه] [کار با محیط] [معرفی کتاب] [نقشه سایت] [درباره ما]