شرایطی را در نظر بگیرید که شما می خواهید از یک نام مشابه برای چندین منظور استفاده کنید . مثلا از کلمه «محاسبه مساحت» برای محاسبه مساحت مربع ، مستطیل ، دایره و مثلث و غیره استفاده کنید . برای رسیدن به این هدف روشی در سی شارپ وجود دارد به نام اوورلودینگ کردن . این کار به این صورت انجام می گیرد که ما درون یک کلاس چندین متد همنام درست می کنیم این متدها باید از نظر امضا با هم متفاوت باشند تا کمپایلر اجازه چنین کاری را بدهد و دچار خطا نشود . حالا منظور از امضا یا همان سیگنچر چیست ؟ امضای هر متد چیزی نیست بجز تعداد ، نوع و ترتیب آرگومان های آن متد .یعنی متدهایی که از نظر تعداد آرگومان متفاوتند امضای متفاوتی دارند متدهایی که از نظر نوع آرگومان متفاوتند نیز از نظر امضا با هم متفاوتند و نهایتا متدهایی که از نظر ترتیب نیز با هم متفاوت باشند از نظر امضا با هم متفاوت می باشند . کافی است تا یکی از این سه شرط برقرار باشد . دقت داشته باشید که امضای متد ربطی به نوع برگشتی آن ندارد و اگر تنها تفاوت بین دو متد در نوع برگشتی آنها باشد ، باعث تفاوت امضای آنها نمی باشد . در کد زیر کلاسی می بینید که در آن عمل اوورلودینگ انجام شده .
class ShapeCalculator
{
// مساحت مستطیل
public double CalculateArea(double width, double height)
{
return width * height;
}
// مساحت دایره
public double CalculateArea(double radius)
{
return Math.PI * radius * radius;
}
// مساحت مثلث
public double CalculateArea(double baseLength, double height, bool isTriangle)
{
if (isTriangle)
return 0.5 * baseLength * height;
return 0; // برای تمایز از حالتهای دیگر
}
}
روش ۱: استفاده از پراپرتی (Property)
اولین روش برای دسترسی به اعضای فرم از یک کلاس مستقل، استفاده از (پراپرتی) است. این روش به دلیل رعایت اصل کپسولهسازی (Encapsulation) در برنامهنویسی شیءگرا، بهترین گزینه محسوب میشود. با پراپرتی، میتوانید دسترسی به کنترلها را کنترل کنید و از تغییر مستقیم آنها جلوگیری کنید.
مثال ساده : فرض کنید یک فرم به نام "Form1" داریم که یک تکستباکس (‘myTextBox’) روی آن است. میخواهیم از یک کلاس مستقل به متن این تکستباکس دسترسی پیدا کنیم.
پراپرتی برای دسترسی به متن تکستباکس که درون کلاس فرم نوشته می شود //
توجه داشته باشید در اینجا چون هدفمان کپسوله کردن اجزاء فرم بوده پراپرتی را هم درون کلاس فرم نوشته ایم تا دسترسی به تکست باکس بصورت کنترل شده انجام شود و اگر قصدمان کپسوله کردن یکی از اجزاء داخل یک کلاس مستقل می بود قطعا برای این منظور پراپرتی های مناسب این کار را نیز درون کلاس می نوشتیم.
public string TextBoxContent
{
get { return myTextBox.Text; }
set { myTextBox.Text = value; }
}
متن کد رویداد باتن که درون کلاس فرم نوشته می شود //
private void button1_Click(object sender, System.EventArgs e)
{
ExternalClass external = new ExternalClass();
external.ChangeText(this);
}
متن کامل کد داخل کلاس مستقل ExternalClass //
public class ExternalClass
{
public void ChangeText(Form1 form)
{
form.TextBoxContent = " سلام از درون پراپرتی " ;
}
}
}
در این پست میخواهیم یاد بگیریم یک کلاس ساده بسازیم و ازش استفاده کنیم؛ کلاسی که تقریباً چیزهای مهم و اصلی یک کلاس رو داشته باشه. بیایید با یه مثال شروع کنیم و خط به خط اون رو توضیح بدیم تا برای کسایی که تازه برنامهنویسی رو شروع کردن، همه چیز روشن بشه.
فرض کنید میخواهیم یه کلاس به اسم Student بسازیم. کدش اینجوریه:
public class Student
{
private string Name { get; set; }
}
public Student(string name)
{
Name = name;
}
public string Introduce()
{
return $"سلام، من {Name} هستم.";
}
}
هر چیزی که به کلاس مربوط میشه، باید بین دو آکولاد {} نوشته بشه. حالا بیایم خط به خط این کد رو توضیح بدیم:
تعریف کلاس:
public class Student
اینجا داریم میگیم که میخواهیم یه کلاس به اسم Student بسازیم. کلمه public یعنی این کلاس از جاهای دیگه توی برنامه قابل دسترسه. کلاس مثل یه نقشه یا قالب میمونه که ما ازش برای ساختن چیزهای مشخص (مثل یه دانشجو با اسم خاص) استفاده میکنیم.
متغیر خصوصی:
private string Name { get; set; }
توی این خط، یه متغیر به اسم Name تعریف کردیم که از نوع رشته (string) هست. کلمه private یعنی این متغیر فقط داخل همین کلاس قابل دسترسی است .. { get; set; } هم به ما اجازه میده که از داخل کلاس، مقدار این متغیر رو بخونیم یا تغییر بدیم.
سازنده کلاس:
public Student(string name)
{
Name = name;
}
این قسمت که بهش سازنده میگن موقع نمونه سازی از کلاس ، صدا زده میشه تا همه چیز رو فراهم کنه یکی از کارهایی که این سازنده انجام میده اینه که متغیر Name رو با اسمی که ما میدیم پر میکنه. مثلاً اگه بنویسیم.
Student s = new Student("رضا");
متغیر Name میشه " رضا " .
تابع Introduce (معرفی) :
public string Introduce()
{
return $"سلام، من {Name} هستم.";
}
این یه تابع عمومیه که ما پس از نمونه سازی از کلاس می تونیم با کمک نام کلاس نمونه به این متد دسترسی داشته باشیم و اون رو اصطلاحا صداش کنیم. وقتی این تابع اجرا بشه ، یه جمله مثل "سلام، من رضا هستم" به ما برمیگردونه. .
چرا متغیر Name رو خصوصی کردیم؟
اگه Name رو بجای private با public تعریف می کردیم ، هر کسی از بیرون کلاس می تونست مستقیم بیاد و مقدارش رو عوض کنه ، مثلا بنویسه
Student.Name = "Reza"
ولی حالا که خصوصی تعریفش کردیم، فقط از داخل کلاس و از طریق تابعهایی که خودمون مینویسیم میشه بهش دسترسی داشت یا تغییرش داد. به این کار میگن کپسوله کردن، یعنی اطلاعات رو توی کلاس محافظت میکنیم و جل تغییرات ناخواسته رو می گیریم .
مثلاً اگه بخوایم یه قانون بذاریم که اسم حتماً چه خصوصیاتی داشته باشه می تونیم با شرط قرار دادن آن اسم ها را کنترل کنیم.
فرض کنید میخواهیم توی برنامهمون از این کلاس استفاده کنیم. میتونیم اینجوری بنویسیم:
Student student1 = new Student("رضا");
Console.WriteLine(student1.Introduce());
خروجی این کد میشه: سلام، من رضا هستم.
چرا این کار مهمه؟
کلاس مثل یه جعبهست که هم اطلاعات (مثل اسم دانشجو) رو نگه میداره و هم کارهایی که میتونیم باهاش انجام بدیم (مثل معرفی کردن). با خصوصی کردن متغیرها و استفاده از تابعها، ما مطمئن میشیم که همه چیز توی برنامهمون منظم و قابل کنترله. این روش باعث میشه برنامههامون وقتی بزرگتر میشن، راحتتر مدیریت بشن و کمتر خطا داشته باشن.
به همین سادگی! حالا یه کلاس ساده ساختیم و میتونیم ازش برای چیزهای پیچیدهتر استفاده کنید.