فصل هفتم متدهای داخلی در# C

<!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

فصل هفتمMohsen_mahyar@yahoo.com

    

C# متدهای داخلی در

آنچه که در این فصل یاد خواهید گرفت:

کردن متدها و استفاده از آنها overload • روش

استفاده از خصوصیات برای کپسولهکردن اطلاعات یک شی

و نقش آنها در ارسال دادهها به متدها ref و out • کار با پارامترهای

برای دسترسی یا مقداردهی به خصوصیات کلاسها set و get • معاونهای

در فصلهای قبل دیدیم که کلاسها شامل فیلدها و متدهایی هستند. فیلدها حالت شی را نشان میدهند و متدها رفتار شی

را تعریف میکنند.

کردن overload نحوه کار متدها را دقیق کاوش خواهید کرد. تابحال نحوهی ایجاد متد را دیده اید. شما _ شما در این فصل

متد را یاد خواهید گرفت. تکنیکی که به شما اجازه میدهد چندین متد همنام ایجاد کنید. این عمل سرویسگیرندهها را برای

احضار متد با انواع پارامتر مختلف قادر میسازد.

این فصل خصوصیات را معرفی میکند. خصوصیات شبیه متغیرهای عضو هستند، اما خصوصیات همچون متدها پیادهسازی

میشوند. این عمل پنهانکردن دادهها 1 را به نحو خوب ادامه میدهد.

کردن متدها overload-1-7

اغلب میخواهید بیش از یک متد همنام داشته باشید. معمولترین مثال این مطلب داشتن چندین سازندهی هم نام است که

ایجاد میکنید. Time به شما اجازه میدهد اشیاء را با انواع مختلف پارامترها ایجاد کنید. برای مثال، اگر شما یک شی

ممکن است بخواهید یک شی _ ساعت ایجاد کنید. مواقعی دیگر _ را با ارسال تاریخ Time احتمال دارد بخواهید شی

کردن سازنده، این گزینههای متعدد را فراهم میسازد. overLoad . را با ارسال یک شی موجود ایجاد کنید Time

1 Information hiding

فصل هفتم- متدهای داخلی

121

را دارد. مناسب Time که تعداد زیادی از عضوهای دادهای کلاس _ است System یک شی درونی کتابخانه DateTime شی

دقیقه و ثانیه به آن ایجاد _ ساعت _ روز _ ماه _ جدید را با ارسال سال Time است که سرویسگیرنده مجاز باشد یک شئ

کند. بعضی سرویسگیرندهها یک یا چند سازنده را ترجیح میدهند.

باید مطمئن باشید که هر سازنده نشانهی منحصربهفردی دارد. نشانهی یک متد از نام _ کردن سازنده overload به منظور

و لیست پارامترهایش تشکیل شده است. اگر دو متد نام یا لیست پارامتر مختلفی داشته باشند. نشانههای مختلفی دارند.

لیست پارامترها میتوانند در تعداد یا نوع پارامترها متفاوت باشند. چهار خط زیر نشان میدهد چگونه متدها را بوسیله

نشانه آنها متمایز کنیم.

void MyMethod(int p١);

void MyMethod(int p١, int p٢); // different number

void MyMethod(int p١, string s١); // different types

void SomeMethod(int p١); // different name

هستند. دو مورد اولی ازنظر تعداد پارامترها متفاوت هستند و متد دوم ()MyMethod های متد overload سه متد اول همه

و سوم در نوع پارامتر دوم با هم متفاوت هستند. این تغییرات در نشانه متدها کافی است تا کامپایلر متدها را متمایز کند.

نیست، فقط یک متد متفاوتی است. یک کلاس میتواند هر تعداد overload متد چهارم با بقیه از نظر نام فرق میکند، این

را با دو سازنده نشان میدهد. یکی از آن متدها یک شی Time 1 کلاس - متد با نشانههای مختلف داشته باشد. مثال 7

را میگیرد و دیگری 6 عدد صحیح میگیرد. DateTime

1- مثال 7

using System;

namespace MethodOverloading

{

public class Time

{

// private member variables

private int Year;

private int Month;

private int Date;

private int Hour;

private int Minute;

private int Second;

// public accessor methods

public void DisplayCurrentTime( )

{

System.Console.WriteLine( "{٠}/{١}/{٢} {٣}:{۴}:{۵}",Month, Date, Year, Hour,

Minute, Second );

}

// constructors

public Time( System.DateTime dt )

{

Year = dt.Year;

Month = dt.Month;

Date = dt.Day;

Hour = dt.Hour;

Minute = dt.Minute;

Second = dt.Second;

}

int Hour, int Minute, int Second )

{

this.Year = Year;

this.Month = Month;

this.Date = Date;

this.Hour = Hour;

this.Minute = Minute;

this.Second = Second;

#C برنامه نویسی

122

}

}

class Tester

{

public void Run( )

{

System.DateTime currentTime = System.DateTime.Now;

Time time١ = new Time( currentTime );

time١.DisplayCurrentTime( );

Time time٢ = new Time( ٢٠٠٠, ١١, ١٨, ١١, ٠٣, ٣٠ );

time٢.DisplayCurrentTime( );

}

static void Main( )

{

Tester t = new Tester( );

t.Run( );

}

}

}

خروجی شبیه زیر است:

٧/١٠/٢٠٠٨ ١۶:١٧:٣٢

١١/١٨/٢٠٠٠ ١١:٣:٣٠

بشناسد. با این Time کامپایلر نمیتواند سازندهها را هنگام ایجاد اشیاء جدید _ اگر نشانهی یک تابع فقط نام آن باشد

چون نشانهی متد پارامترها و نوع دادههای آنها را شامل است، کامپایلر قادر است هر سازنده را با نشانه مورد نظر _ وجود

تطابق دهد.

System.DateTime currentTime = System.DateTime.Now;

Time time١ = new Time(currentTime);

public Time(System.DateTime dt)

2 سازندهای که نشانهی آن 6 آرگومان صحیح میگیرد را فراخوانی کند. time همچنین کامپایلر قادر است برای

Time time٢ = new Time(٢٠٠٠،١١،١٨،١١،٠٣،٣٠);

public Time(int Year, int Month, int Date, int Hour, int Minute, int Second)

میکنید، باید نشانه آن را تغییر دهید. در تغییر نوع داده بازگشتی آزاد هستید، چون overload زمانی که یک متد را

نمیکند. دو متد که نشانه یکسان دارند و نوع بازگشتی آن متفاوت باشد یک خطای کامپایلر overload تغییرات آن متد را

تولید میکنند.

-2-7 کپسوله کردن دادهها با خصوصیات

پسندیده است. بدین معنی که فقط متدهای عضو کلاس private در کل، طراحی متغیرهای عضو یک کلاس بصورت

میتوانند به مقادیر آنها دستیابی کنند. زمانی که از دستیابی مستقیم به متغیرهای عضو یک کلاس جلوگیری میکنید، پنهان

کردن دادهها را با اجبار اعمال میکنید که بخشی از کپسوله سازی یک کلاس است.

باشند. این عمل خوب است، اما چگونه دسترسی به دادهها را private برنامهنویسان شیگرا میگویند متغیرهای عضو باید

کاربرد خصوصیات است. #C برای سرویسگیرنده ها فراهم کنیم. جواب برنامه نویسان

خصوصیات دسترسی به حالت کلاس را بدون دسترسی مستقیم به فیلدها اجازه میدهند و پیادهسازی خصوصیات شبیه

متدها انجام میشود. این راهحل ایدهآل است. سرویسگیرنده دسترسی مستقیم به حالت شی را میخواهد. طراح کلاس

میخواهد حالت داخلی کلاس را در فیلدهای کلاس پنهان کند و دسترسی غیر مستقیم را از طریق یک متد فراهم میکند.

با جدا کردن حالت کلاس از متدهایی که به حالت کلاس دسترسی دارند، طراح کلاس برای تغییر حالت داخلی کلاس در حد

به عنوان یک متغیر عضو ذخیره میشد. Hour برای اولین بار ایجاد شد، احتمالا مقدار Time نیاز آزاد است. زمانی که کلاس

فصل هفتم- متدهای داخلی

123

محاسبه یا از پایگاهداده بازیابی شود. اگر سرویسگیرنده Hour زمانی که کلاس مجددا طراحی میشود، ممکن است مقدار

سرویسگیرنده را با شکست مواجه _ داشته باشد، تغییر دادن نحوهی حل مسئله Hour دسترسی مستقیم به متغیر عضو

خواهد کرد.

2 یک خصوصیت بنام - ویژگی پنهانسازی داده مورد نیاز، طراحی شیگرای خوب را فراهم میکند. مثال 7 _ بطور خلاصه

ایجاد میکند که در پاراگرافهای زیر بحث میشود. Hour

using System;

namespace Properties

{

public class Time

{

// private member variables

private int year;

private int month;

private int date;

private int hour;

private int minute;

private int second;

// create a property

public int Hour

{

get

{

return hour;

}

set

{

hour = value;

}

}

// public accessor methods

public void DisplayCurrentTime( )

{

System.Console.WriteLine("Time: {٠}/{١}/{٢} {٣}:{۴}:{۵}",month, date, year, hour,

minute, second );

}

// constructors

public Time( System.DateTime dt )

{

year = dt.Year;

month = dt.Month;

date = dt.Day;

hour = dt.Hour;

minute = dt.Minute;

second = dt.Second;

}

}

class Tester

{

public void Run( )

{

System.DateTime currentTime = System.DateTime.Now;

Time t = new Time( currentTime );

t.DisplayCurrentTime( );

// access the hour to a local variable

int theHour = t.Hour;

// display it

System.Console.WriteLine( "Retrieved the hour: {٠}",theHour );

// increment it

theHour++;

// reassign the incremented value back through

#C برنامه نویسی

124

// the property

t.Hour = theHour;

// display the property

System.Console.WriteLine( "Updated the hour: {٠}", t.Hour);

}

[STAThread]

static void Main( )

{

Tester t = new Tester( );

t.Run( );

}

}

}

خروجی باید چیزی شبیه این باشد :

Time : ٧/١٠/٢٠٠٨ ١٢:٧:۴٣

Retrieved the hour: ١٢

Updated the hour: ١٣

1 set یک خصوصیت را با نوشتن نوع و نام آن که با {} دنبال میشود، تعریف کنید. در داخل آکولادها میتوانید معاونهای

را اعلان کنید. این معاونها خیلی شبیه متدها هستند، اما در واقع بخشی از خصوصیت هستند. هدف این معاونها get و

فراهمسازی یک راه ساده برای بازیابی یا تغییر مقدار عضو خصوصی کلاس است.

دارد که برای value یک پارامتر ضمنی بنام set هیچ کدام یک از این معاونها پارامترهای صریح ندارند اگرچه معاون

تنظیم مقدار متغیر عضو استفاده میشود.

اسامی خصوصیتها با علائم پاسکال نوشته میشوند. _ طبق قرارداد

را ایجاد میکند. set و get دو معاون Hour 2 اعلان خصوصیت - در مثال 7

{

get

{

return hour;

}

set

{

hour = value;

}

}

هر معاون یک بدنه دارد که کار بازیابی یا تنظیم مقدار خصوصیت را انجام میدهد. ممکن است مقدار خصوصیت در یک

پایگاهداده ذخیره شود یا اینکه در یک متغیر عضو خصوصی ذخیره شود.

private int hour;

get -1 معاون -2-7

Hour 2 معاون خصوصیت - شبیه متدی است که یک شی از نوع خصوصیت را برمیگرداند. در مثال 7 get بدنهی معاون

را بر میگرداند. hour برمیگرداند. آن مقدار متغیر عضو خصوصی int شبیه متدی است که یک مقدار

get

{

return hour;

}

1 Accessor

فصل هفتم- متدهای داخلی

125

Hour احضار میشود. به عنوان مثال در کد زیر مقدار خصوصیت get هر زمان به بازیابی مقدار خصوصیت نیاز است، معاون

Hour به مقدار خصوصیت theHour به یک متغیر محلی انتساب داده میشود. در سرویسگیرنده، متغیر محلی Time شی

انتساب داده میشود. t شی

Time t = new Time(currentTime);

int theHour = t.Hour;

set -2 معاون -2-7

را برای نمایش value باید کلمهی کلیدی set یک خصوصیت را مقداردهی میکند. زمان تعریف یک معاون set معاون

آرگومان ضمنی بکار برید. که این مقدار به خصوصیت انتساب داده میشود.

set

{

hour = value;

}

میتواند آنرا به یک set مجددا در اینجا یک متغیر عضو خصوصی برای ذخیره مقدار خصوصیت استفاده میشود. اما معاون

پایگاه داده بنویسد یا متغیرهای عضو دیگر مورد نیاز را بروز کند. زمانیکه یک مقدار به خصوصیت انتساب میکنید، معاون

بطور اتوماتیک احضار میشود و مقدار پارامتر ضمنی با مقدار مورد نظر شما مقداردهی میشود. set

theHour++;

/ 1 نظر / 76 بازدید
maryam

salam[قهقهه]