فصل پنجم کلاسها و اشیاءدر #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# کلاسها و اشیاءدر

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

نحوهی تعریف یک کلاس و استفاده از آن

معرفهای دسترسی و تاثیر آنها روی اعضای کلاس

سازندهها و مخرب کلاس

اعضای نمونه و ایستای کلاس و تفاوتهای کاربردی آنها

تخصیص حافظه به نمونههای کلاس

this • کلمهیکلیدی

صحبت کردیم. به یاد دارید که این انواع داده برای (#c در فصلهای قبلی در مورد انواع داده درونی (ساخته شده در

تعریف انواع داده جدید برای انطباق با #c نگهداری و دستکاری مقادیر عددی و رشتهای استفاده میشدند. قدرت واقعی

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

انواع دادهی جدید را مشخص میکنید.

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

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

میتوانید کار کنید.

یک کلاس سگ شرح میدهد، آنها چه چیزهای مشابهی دارند. آنها وزن، طول، رنگ چشم، رنگ مو، مزاج و غیره دارند. آنها

میتوانند کارهای مشابهی انجام دهند، همچون خوردن، راه رفتن، پارسکردن و خوابیدن. هر سگ خاصی، وزن و قد، رنگ

چشم و مو و مزاج خاصی دارد.

مزیت بزرگ برنامهنویسی شیگرا آن است که کلاسها، ویژگیها و تواناییهای یک نوع داده را در یک واحد منحصر به فرد و

تودار کپسوله میکنند.

به عنوان ListBox ویندوز را مرتب کنید. کنترل ListBox برای مثال، فرض کنید میخواهید محتویات یک نمونه از کنترل

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

مرتب شود، فقط به آن میگویید که ListBox کپسوله شده و کلاسهای دیگر از نحوهی کار آن مطلع نیستند. اگر بخواهید

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

فصل چهار-برنامه نویسی شی گرا

87

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

آن به اعضای کلاس معروف هستند. رفتار کلاس با نوشتن متدها ایجاد میشود. یک متد امر عادی است که هر شیئی از آن

میتواند ListBox داشته باشد و کلاس Bark میتواند متدی به نام Dog کلاس میتواند اجرا کند. برای مثال، یک کلاس

داشته باشد. Sort متدی به نام

حالت کلاس با فیلدها نگهداری میشود. ممکن است فیلدها از انواع داده اولیه یا اشیائی از کلاسهای دیگر باشند.

در نهایت، ممکن است کلاس خصوصیاتی داشته باشد که برای سرویسدهنده شبیه متد ها عمل میکنند، اما برای

سرویسگیرندهی کلاس شبیه فیلدهای کلاس به نظر میرسند. یک سرویس گیرنده، شیئی است که با هر نمونه از کلاسی

تعامل دارد .

-1-5 تعریف کلاس

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

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

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

طول، عرض، موقعیت و رنگ متن دارند.

برنامهنویسها رفتارهای معینی از کادرلیست 1ها انتظار دارند. آنها میتوانند باز، بسته، مرتب و غیره شوند.

ایجاد کنید که این ویژگیها و تواناییها را ListBox برنامهنویسی شیگرا به شما اجازه میدهد نوع دادهی جدیدی بنام

کپسوله میکند.

برای تعریف یک نوع داده یا کلاس جدید، ابتدا آن را اعلان کرده و سپس متدها و فیلدهای آن را تعریف کنید. یک کلاس را

اعلان کنید. گرامر کامل آن به صورت زیر است. class با استفاده از کلمهی کلیدی

[attributes ] [access-modifiers] class identifier [:base-class] {class-body}

صفات 2 برای فراهمکردن متاداده خاصی درباره یک کلاس استفاده میشوند (اطلاعاتی درباره ساختار یا کاربرد کلاس). صفات

نیاز ندارید. معرفهای دسترسی بعدا بررسی میشوند ( معمولا کلاسهای شما از کلمه کلیدی #C را برای برنامهنویسی عادی

به عنوان معرف دسترسی خود استفاده میکنند). public

با اسامی نامگذاری میشوند ( سگ، کارمند، کادرلیست ). قوانین #C شناسهی 3 کلاس همان نام کلاس است. کلاسهای

نامگذاری از نمادگذاری پاسکال استفاده میکنند. در نمادگذاری پاسکال خط فاصله یا زیرخط استفاده نمیکنند و در

.(GoldenRetriever) شناسههای یک یا چندکلمهای، حرف اول هر کلمه را بزرگ مینویسند

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

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

class Dog

{

int age; // the dog's age

int weight; // the dog's weight

Bark( ) { //... }

1 listBox

2 Attributes

3 identifier

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

88

Eat( ) { // ... }

}

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

خصوصیات سگ را شرح میدهند.

-1 نمونهسازی 1 اشیاء -1 -5

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

مرحله برای ایجاد یک شی یا نمونهسازی لازم هستند. برای اعلان یک شی، ابتدا نام کلاس و به دنبال آن نام شی را

بنویسید.

Dog milo; // declare milo to be an instance of Dog

استفاده میکنیم. پس نام یک Camel این عمل به ایجاد یک متغیر محلی شباهت ندارد. در تعریف شی از قرارداد نمادگذاری

باشد. myDog متغیر یا شی میتواند مانند

عمل اعلان به تنهایی یک نمونهی واقعی ایجاد نمیکند. برای ایجاد یک نمونه از یک کلاس، باید با استفاده از کلمه کلیدی

به آن شی حافظه تخصیص دهیم. new

milo=new Dog();//allocate memory for milo

میتوانید اعلان یک شی و تخصیص حافظه به آن را ترکیب کنید و در یک خط بنویسید.

;() Dog milo=new Dog

را ایجاد میکند. دلیل وجود پرانتزها Dog اعلان میکند و یک نمونهی جدید از Dog را به عنوان شیئی از نوع milo این کد

را بعدا خواهید فهمید.

نقطهی ورود ()Main هر چیزی بوسیلهی یک کلاس اتفاق میافتد. هیچ متدی نمیتواند خارج از کلاس اجرا شود. متد #C در

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

شبیه هر متد دیگر باید در یک کلاس باشد. ()Main ایجاد خواهید کرد، چون متد ()Main کلاس کوچک برای جا دادن متد

public class Tester

{

public static void Main( )

{

//...

}

}

ندارید. برای این Tester ایجاد شده است، شما هنوز هیچ نمونهای از نوع ()Main برای جا دادن متد Tester اگرچه کلاس

کار خواهیم نوشت:

;()Tester myTester = new Tester

فراخوانی متدهای دیگر کلاس را از طریق شی ایجادشده ممکن میسازد. ،Tester ایجاد یک نمونه از کلاس

1 Instantiate

فصل چهار-برنامه نویسی شی گرا

89

Time -2 ایجاد کلاس -1 -5

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

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

فراهم کرده است. DataTime یک کلاس عملیاتی به نام NET. چارچوب

1) پیادهسازی کنید. - شما این کلاس را با تعریف یک متد و 6 متغیر ( مثال 5

Time 1 کلاس - مثال 5

using System;

public class Time

{

// private variables

private int year;

private int month;

private int date;

private int hour;

private int minute;

private int second;

// public methods

public void DisplayCurrentTime( )

{

Console.WriteLine( "stub for DisplayCurrentTime" );

}

}

public class Tester

{

static void Main( )

{

Time timeObject = new Time( );

timeObject.DisplayCurrentTime( );

}

}

second با اعلان تعدادی متغیر عضو Time ایجاد میکند. تعریف کلاس Time این کد یک نوع داده جدید کاربری به نام

شروع میشود. ,minute ,hour ,day ,month ,year

تعیین میکند که این فیلدها فقط در متدهای داخل کلاس قابل استفاده هستند. کلمه کلیدی private کلمهی کلیدی

یک معرف دسترسی است . private

ترجیح میدهند اعلان فیلدها در کنار هم ( بالا یا پایین) کلاس قرار گیرند. البته #C بیشتر برنامه نویسان

ضروری نیست.

بر میگرداند، به عبارت void است. این متد مقدار DisplayCurrentTime متد ،Time تنها متد اعلانشده در کلاس

دیگر هیچ مقدار برگشتی ندارد.

اسلام احمد زاده - 09177112161 - C# برنامه نویسی

90

ممکن است بخواهیم در ابتدای برنامهنویسی، ساختار کلی برنامه را بدون در نظر گرفتن جزئیات آن ایجاد کنیم، در اینصورت

که فقط DisplayCurrentTime یک دستور ساده در متدها مینویسیم که نشاندهندهی اجرای این متد باشد. مانند متد

یک پیام را در خروجی چاپ میکند.

بنام Time یک نمونه از ()Main را در بردارد. در ()Main تعریف میشود که متد Tester کلاس ،Time بعد از کلاس

ایجاد میشود. timeObject

Time timeObject = new Time( );

آن شی DisplayCurrentTime میتواند از متد ()Main است، متد Time یک نمونه از کلاس timeObject چون

استفاده کرده و آن را برای نمایش زمان فراخوانی کند.

timeObject.DisplayCurrentTime( );

متدی از یک کلاس را با نوشتن نام شی و به دنبال آن نام متد (که با نقطه از هم جدا شده اند)، می توان احضار کرد و

پارامترهای متد در داخل پرانتزها قرار میگیرند. اگر متدی پارامتر نداشته باشد، پرانتز خالی نیز اجباری است.

-3 معرفهای دسترسی -1 -5

1 معرفهای - یک معرف دسترسی نحوه دستیابی به اعضای کلاس، از بیرون یا داخل کلاس را تعیین میکند. جدول 6

را خلاصه میکند. #C دستیابی

1- معرفهای دستیابی - جدول 5

معرف دسترسی محدودیتها 1

علامتگذاری شدهاند، برای هر متد از public بدون محدودیت. اعضایی که با public

هر کلاسی نمایان هستند.

این اعضا فقط به متدهای همان کلاس نمایان هستند. private

این اعضا برای متدهای همان کلاس و کلاسهایی که از آن مشتق شدهاند، protected

نمایان هستند

برای همه کلاسهای موجود در اسمبلی مربوطه نمایان هستند internal

Protected

Internal برای متدهای همان کلاس و کلاسی که از آن مشتق شده و در اسمبلی مربوطه

قرار دارند، نمایان است.

بخشی از واسط عمومی کلاس هستند. آنها نحوهی رفتار کلاس را تعریف public متدهای

میکنند.

برای انجام کاری استفاده public متدهای کمکی هستند که توسط متدهای private متدهای

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

کلاسهای دیگر نمایان باشند.

1 Restrictions

فصل چهار-برنامه نویسی شی گرا

91

توجه: اگر چند معرف دسترسی در چندین سطح روی یک عنصری اعمال شوند، محدودترین آنها در نظر

گرفته میشود.

اعلان میشوند تا هر کلاس دیگر بتواند از آن استفاده کند. public هر دو ()DisplayCurrentTime و متد Time کلاس

2- باشد، در این حالت متدهای مربوط به کلاسهای دیگر نمیتوانند آنرا احضار کنند. در مثال 6 private اگر متد مورد نظر

احضار شده است. این عمل معقول است، چون کلاس Tester از طریق یک متد کلاس ()DisplayCurrentTime متد

علامتگذاری شدهاند. public هر دو بصورت DisplayCurrentTime و متد Time

-2-5 آرگومانهای متد

رفتار یک کلاس با متدهای آن کلاس تعریف میشود. برای انعطافپذیر کردن متدها، میتوانید پارامترهایی را تعریف کنید.

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

پارامتری تعریف کنید که نوع عمل مرتبسازی را به آن ارسال ()Sort میتوانید در متد ،ListBox صعودی و نزولی یک

کند.

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

بر void تعریف میکند که مقدار ()MyMethod قبل از نام آن پارامتر تعیین میشود. برای مثال، اعلان زیر یک متد به نام

میگرداند و دو پارامتر میگیرد.

void MyMethod (int firstParam, Button secondParam)

{

// ...

}

2 نحوهی ارسال مقادیر به یک متد را نشان میدهد. - در بدنهی متد، پارامترها همانند متغیرهای محلی عمل میکنند. مثال 5

2- مثال 5

using System;

public class MyClass

{

public void SomeMethod( int firstParam, float secondParam )

{

Console.WriteLine("Here are the parameters received: {٠}, {١}",firstParam,

secondParam );

}

}

public class Tester

{

static void Main( )

{

int howManyPeople = ۵;

float pi = ٣٫١۴f;

MyClass mc = new MyClass( );

mc.SomeMethod( howManyPeople, pi );

}

}

خروجی آن به صورت زیر است:

Here are the parameters received 5،3,14

ایجاد و مقداردهی اولیه میشوند. این متغیرها به pi و howManyPeople دو متغیر محلی (Main)

/ 0 نظر / 16 بازدید