Class قالب یک Object را مشخص میکند. در واقع Class مشخص کنندهی data و code ای است که روی data عمل میکند. سیشارپ از مشخصات یک Class برای ساخت Object استفاده میکند بنابراین Object نمونهای از یک Class است. ما میتوانیم به تعداد دلخواه از یک کلاس Object بسازیم.
class className
}
declare instance variables//
;access type var-name1
;access type var-name2
declare methods//
access ret-type methodName1(parameters)
}
body of method//
{
access ret-type methodName2(parameters)
}
body of method//
{
{
در اینجا، access نوع دسترسی به متغیر و متد مربوطه را مشخص میکند. مشخص کردن نوع دسترسی اختیاری است و اگر نوع دسترسی را مشخص نکنید، نوع دسترسی بهطور پیشفرض private در نظر گرفته میشود. اعضایی از کلاس که دسترسی به آنها private در نظر گرفته میشود فقط توسط همان کلاس و اعضای همان کلاس قابل دسترسی هستند. اگر دسترسی اعضای کلاس بهصورت public در نظر گرفته شود آنگاه آن اعضا در همهجای برنامه قابل دسترسی هستند.
کلاسهایی که میسازید باید هدف خاصی از ساخت آنها داشته باشید و از قرار دادن هرگونه اطلاعات نامربوط در آن پرهیز کنید. تا پیش از این، کلاسی که از آن در برنامههایمان استفاده میکردیم تنها یک method داشت که آنهم متد ()Main بود. متد ()Main تنها باید در کلاسی قرار داشته باشد که آن کلاس نقطه شروع برنامهتان است.
در مثال زیر یک کلاس به اسم Car میسازیم که شامل سه متغیر است:
class Car
}
;public string Color
;public string Model
;public int MaxSpeed
{
در این کلاس نوع دسترسی هر سه متغیر public است. به این معنی که این سه متغیر میتوانند در همهجای برنامه قابل دسترسی باشند. در این کلاس هیچ method ای تعریف نکردهایم و این یک کلاس data-only است. هنگامیکه یک کلاس را تعریف میکنید در واقع یک data type جدید بهوجود میآورید که در این مثال اسم این دیتاتایپ، Car است. شما از این اسم برای ساخت اشیائی از جنس Car استفاده میکنید.
با تعریف یک کلاس شما فقط قالب یک شیء را مشخص میکنید و در واقع هنوز هیچ object ای از آن نساختهاید. در مثال قبل شما فقط مشخص کردید که یک ماشین میتواند سه مشخصهی رنگ، ماکسیموم سرعت و مدل را داشته باشد اما شما هنوز هیچ ماشینی را نساختهاید و فقط مشخص کردهاید که اگر قرار است ماشینی ساخته شود باید شامل این سه مشخصه باشد!
برای اینکه از کلاس Car، یک شیء بسازید، مینویسید:
Car BMW = new Car(); // create an object of type Car
بعد از اجرای این خط، یک شیء از کلاس Car ساخته میشود و کلاس Car اکنون یک واقعیت فیزیکی دارد چراکه شما با توجه به مشخصاتی که برای یک ماشین تعریف کردید، یک BMW را ساختید. در حال حاضر نگران جزئیات این خط کد نباشید.
از هر کلاس میتوانید به تعداد دلخواه شیء بسازید. هربار که از یک کلاس شیء میسازید هر شیء، کپی خودش را از متغیرهای کلاس مربوطه دارد. بنابراین هر شیء Car، کپی خودش را از متغیرهای Color، Model و MaxSpeed دارد. برای دسترسی به این متغیرها از عملگر دسترسی به اعضا استفاده میکنید که این عملگر، یک نقطه (dot operator) است. dot operator اسم یک شیء را به اسم یکی از اعضای همان شیء متصل میکند:
object.member
برای مثال به این طریق میتوانید رنگ BMW تان را تنظیم کنید:
;"BMW.Color = "Blue
به مثال زیر توجه کنید:
. A program that uses the Car class //
;using System
class Car
}
;public string Color
;public string Model
;public int MaxSpeed
{
.This class declares two objects of type Car //
class Example
}
()static void Main
}
First Object //
;()Car mercedesBenz = new Car
;"mercedesBenz.Color = "Yellow
;"mercedesBenz.Model = "McLaren
;mercedesBenz.MaxSpeed = 300
;Console.WriteLine("Mercedes Benz has:")
;Console.WriteLine(" " + mercedesBenz.Color + " Color")
;Console.WriteLine(" " + mercedesBenz.Model + " Model")
;Console.WriteLine(" " + mercedesBenz.MaxSpeed + " Max Speed")
;()Console.WriteLine
Second Object//
;()Car BMW = new Car
;"BMW.Color = "Black
;"BMW.Model = "M6
;BMW.MaxSpeed = 250
;Console.WriteLine("BMW has:")
;Console.WriteLine(" " + BMW.Color + " Color")
;Console.WriteLine(" " + BMW.Model + " Model")
;Console.WriteLine(" " + BMW.MaxSpeed + " Max Speed")
{
{
در این مثال از کلاس Car دو شیء مختلف را ساختیم که هرکدام رنگ، مدل و ماکسیموم سرعت مخصوص به خود را دارند. در این برنامه دو کلاس Example و Car موجود است. اینها دو کلاس جدا هستند و تنها ارتباط آنها این است که در کلاس Example دو شیء از کلاس Car ساخته میشود. ما در کلاس Example میتوانیم به اعضای کلاس Car دسترسی داشته باشیم، چراکه دسترسی آنها public است اما اگر دسترسی آنها private باشد فقط در کلاس Carقابل دسترسی هستند.
چگونه یک Object ساخته میشود؟
در مثال قبل از خط کد زیر برای ساخت یک شیء استفاده کردیم:
;()Car BMW = new Car
این خط کد، سه کار را انجام میدهد. ابتدا، یک متغیر به اسم BMW از جنس Car میسازد. این متغیر به خودی خود، یک شیء نیست بلکه متغیری است که به یک شیء رجوع میکند (آدرس یک شیء را در خود ذخیره میکند). این خط کد در مرحلهی دوم توسط کلمهیکلیدی new یک شیء را میسازد و سپس در مرحلهی سوم توسط علامت مساوی (=) متغیر و شیء ساخته شده را به هم وصل میکند (به متغیر BMW آدرس جایی که object ساخته شده قرار دارد اختصاص داده میشود). بنابراین بعد از اجرای این خط کد، متغیر BMW به یک شیء از جنس Car رجوع میکند.
خط کد بالا را به طریق زیر هم میتوانید بنویسید:
;Car BMW
;()BMW = new Car
در خط اول متغیری از جنس Car تعریف کردهاید که میتواند آدرس یک شیء را در خود ذخیره کند (میتواند به یک شیء رجوع کند). در خط دوم، یک شیء از جنس Car ساخته میشود و آدرس آن در متغیر BMW ذخیره میشود بنابراین بعد از اجرای این دستورات متغیر BMW و شیء ساخته شده به هم وصل هستند.
مطمئناً تا اینجا متوجه شدهاید که متغیر BMW شیء را در خودش ذخیره نمیکند بلکه شیء در حافظه ذخیره میشود و متغیر فقط آدرس جایی که شیء قرار دارد را در خود ذخیره میکند. اگر بهیاد داشته باشید بیان شد که سیشارپ شامل دو دستهبندی برای data type (نوع اطلاعات) است که یکی value type و دیگری reference type بود. تفاوت بین ایندو مقداری است که متغیر در خودش نگاه میدارد. برای یک متغیر value type، متغیر مستقیماً خود مقدار را نگهداری میکند:
در اینجا متغیر x از جنس int و مستقیماً شامل مقدار ۲۲ است. به همین دلیل int را value type مینامیم.
اما در این مورد:
متغیر BMW خود شیء را نگهداری نمیکند بلکه تنها آدرس آن را ذخیره دارد به همین دلیل کلاسها reference type هستند.
Method چیست؟
Method ها شبیه به Procedure ها، Function ها و ... در دیگر زبانهای برنامهنویسی هستند. Method ها و متغیرها (instance variables) تشکیل دهندهی اجزای اصلی کلاس هستند. کلاسی که در مثالهای قبلی ساخته بودیم فقط شامل متغیر بود (data-only). اکنون قصد داریم کلاسی بسازیم که شامل Method هم باشد. اصولاً Method ها، متغیرهایی که در کلاس تعریف میشوند را تغییر میدهند و در بیشتر موارد باعث میشوند بتوانید به متغیرهای کلاس دسترسی داشته باشید. معمولاً قسمتهای دیگر برنامه از طریق Method های یک کلاس با آن در تعامل هستند.
هر Method باید یک وظیفه را بر عهده داشته باشد، نه چند وظیفه. هر Method یک اسم دارد و شما از طریق همین اسم میتوانید Method را صدا بزنید و آن را اجرا کنید. برای نامگذاری Method ها نباید از اسم کلمههای کلیدی سیشارپ و ()Main که از پیش رزرو شده است استفاده کنید. بعد از نام Method پرانتز باز و بسته قرار میگیرد. بهعنوان مثال اگر نام یک Method را CalculateSum انتخاب کرده باشد باید بنویسید ()CalculateSum و اینکار باعث میشود نام Method را از نام متغیرها تشخیص دهید.
فرم کلی یک Method بهشکل زیر است:
access ret-type name(parameter-list)
}
body of method//
{
در اینجا access مشخص کنندهی نوع دسترسی است (access modifier) و دسترسی قسمتهای دیگر برنامه را به این Method کنترل میکند. همانطور که پیشتر بیان شد، قرار دادن access modifier اختیاری است و درصورتی که آن را ننویسید، private محسوب میشود. ret-type مشخص کنندهی نوع مقداری است که Method برمیگرداند. اگر Method هیچ مقداری را برنگرداند ret-type باید void باشد. name مشخص کنندهی اسم Method است و در قسمت parameter-list لیستی از متغیرها قرار میگیرید که Method میتواند آنها را دریافت کند. اگر Method هیچ پارامتری نداشته باشد این قسمت باید خالی گذاشته شود.
به مثال زیر توجه کنید:
;using System
class HelloWorld
}
public void SayHello(string name, string family)
}
;Console.WriteLine("Hello " + name + " " + family)
{
{
class Example
}
()static void Main
}
;()HelloWorld myWorld = new HelloWorld
;myWorld.SayHello("Masoud", "Darvishian")
{
{
در این مثال، در کلاس HelloWorld متدی را به اسم ()SayHello قرار دادیم که هیچ مقداری را برنمیگرداند (void) و تنها دو مقدار را بهعنوان ورودی دریافت و پیغام خوشآمدگویی را چاپ میکند. در متد ()Main برای اینکه به متد ()SayHello دسترسی داشته باشیم ابتدا باید یک شیء از کلاس HelloWorld بسازیم سپس میتوانیم از طریق نام آن شیء به متد دسترسی پیدا کنیم (زیرا دسترسی public است).
در دو حالت یک متد return میشود:
۱ – زمانی که برنامه به کروشه پایانی ( { ) متد برسد.
۲ – زمانی که با کلمه return مواجه شود.
برای استفاده از کلمهی return در متد، دو حالت وجود دارد. حالت اول زمانی است که از void methods استفاده میکنید (متدهایی که هیچ مقداری را برنمیگردانند) و حالت دوم برای متدهایی است که مقداری را برمیگردانند.
استفاده از return در یک void method موجب میشود اجرای متد در همانجایی که هست متوقف شود.
به مثال زیر دقت کنید:
()public void MyMeth
}
;int i
for (i = 0; i < 10; i++)
}
if (i == 5) return; // stop at 5
;()Console.WriteLine
{
{
در این Method زمانیکه i برابر با ۵ باشد، اجرای مابقی خط کدهای متد متوقف شده و داستان از همان نقطهای که متد صدا زده شده است ادامه مییابد. همچنین میتوانید در void methods از چندین return در جاهای مختلف آن استفاده کنید اما ترجیحاً این کار انجام ندهید چراکه معمولاً اینجور استفاده در نقاط مختلف یک Method موجب خرابی کد میشود.
البته return کردن به این شکل از یک void method رایج نیست و بیشتر Method ها یک مقدار را برمیگردانند. return کردن یک مقدار به منظورهای مختلفی در برنامهنویسی استفاده میشود. در بعضی موارد مقداری که return میشود نتیجهی یکسری محاسبات است. در بعضی موارد دیگر مقدار بازگشتی نشاندهندهی موفقیت یا عدم موفقیت یک عملیات خاص است. درکل، مقدار بازگشتی بستگی به هدف شما از نوشتن آن Method دارد.
به Method زیر توجه کنید:
public double Addition(double x, double y)
}
;double result = x + y
;return result
{
این Method دو مقدار را دریافت، آنها را جمع و در متغیر result ذخیره میکند و در نهایت مقدار result را return میکند (مقدار result را برمیگرداند). فرض کنید ما مقدار ۲ و ۵ را به این Method بدهیم. برای اینکه از این Method و مقداری که return میکند استفاده کنیم مینویسیم:
;using System
class Calculator
}
public double Addition(double x, double y)
}
;return x + y
{
{
class Example
}
()static void Main
}
;double result
;()Calculator myCalculate = new Calculator
;result = myCalculate.Addition(5, 2)
;Console.WriteLine("Addition: " + result)
{
{
همانطور که میبینید از کلاسی که Method در آن قرار داشت یک شیء ساختیم و سپس متد را صدا زدیم و مقادیر ۲ و ۵ را به آن دادیم. این متد، ۲ و ۵ را جمع و حاصل این جمع (عدد ۷) را return میکند. سپس عدد ۷ در متغیرresult ذخیره میشود.
به مثال زیر توجه کنید:
;using System
class Calculator
}
public double Multipliction(double x, double y)
}
;return x * y
{
public double Division(double x, double y)
}
;return x / y
{
public double Subtraction(double x, double y)
}
;return x - y
{
public double Addition(double x, double y)
}
;return x + y
{
{
class Example
}
()static void Main
}
;double result
;()Calculator myCalculate = new Calculator
;Console.Write("Enter first number: ")
;double firstNum = Convert.ToDouble(Console.ReadLine())
;Console.Write("Enter second number: ")
;double seconNum = Convert.ToDouble(Console.ReadLine())
;()Console.WriteLine
;Console.WriteLine("Calculations")
;result = myCalculate.Addition(firstNum, seconNum)
;Console.WriteLine(" Addition: " + result)
;result = myCalculate.Subtraction(firstNum, seconNum)
;Console.WriteLine(" Subtraction: " + result)
;result = myCalculate.Multipliction(firstNum, seconNum)
;Console.WriteLine(" Multipliction: " + result)
;result = myCalculate.Division(firstNum, seconNum)
;Console.WriteLine(" Division: " + result)
;result = Math.Pow(firstNum, seconNum)
;Console.WriteLine(" Power: " + result)
{
{
در واقع این همان مثال قبلی است با این تفاوت که اندکی آن را توسعه دادیم. در این مثال، کلاسی به اسم Calculator داریم که در آن متدهایی قرار دارد که عملیات ضرب، تقسیم، جمع و تفریق را انجام میدهند و نتیجه را باز میگردانند. در این برنامه مقادیری که باید به این متدها داده شود را از کاربر دریافت کردهایم و در نهایت نتیجهی محاسبات را نمایش دادهایم. همچنین از متد ()Pow که در کلاس Math قرار دارد (یکی از متدهای از پیش تعریف شده در داتنت فریمورک است) برای به توان رساندن استفاده کردهایم. توجه کنید که اگر ret-type یک متد را از جنس double تعریف کردهاید آنگاه مقداری را که return میکنید نیز باید double باشد.
مطمئناً تا این لحظه متوجه شدهاید هنگامیکه مینویسیم ()Console.WriteLine درحال استفاده کردن از متد ()WriteLine هستیم که این متد در کلاس Console قرار دارد. همینطور موارد مشابهی چون ()Console.ReadLine و غیره.
استفاده از پارامترها
در مثالهای قبلتر چگونگی استفاده از پارامتر را مشاهده کردید. هنگامی که یک Method را صدا میزنید میتوانید یک یا چندین مقدار را به آن بدهید. مقداری که به یک Method داده میشود argument نام دارد. درون Method، متغیری که این argument را دریافت میکند پارامتر (parameter) نامیده میشود. پارامترها درون پرانتزی که جلوی نام متد قرار میگیرد تعریف میشوند و طریقهی تعریف کردن پارامتر به همان شکل است که بهصورت عادی یک متغیر تعریف میشود. این پارامترها فقط در محدودهی خود آن متد شناخته میشوند.
به مثال زیر توجه کنید:
;using System
class ChkNum
}
public bool isEven(int number)
}
if (number % 2 == 0)
;return true
else
;return false
{
{
class Example
}
()static void Main
}
;()ChkNum ob = new ChkNum
for (int i = 0; i < 10; i++)
}
if (ob.isEven(i))
;Console.WriteLine(i + " is even")
else
;Console.WriteLine(i + " is odd")
{
{
{
در این برنامه، ۱۰ مرتبه متد ()isEven صدا زده میشود و هربار مقداری متفاوت بهعنوان argument به آن داده میشود و درون متد، پارامتر number هربار این argument را دریافت میکند. متد ()isEven عدد دریافتی را بررسی نموده و درصورتی که زوج باشد مقدار true را بازمیگرداند.
منبع:webtarget