انتزاع یا Abstraction:
پس از آشنایی با کپسولهسازی، حالا میخوام درباره دومین رکن مهم برنامهنویسی شیءگرا، یعنی انتزاع یا Abstraction صحبت کنم.
انتزاع به معنی سادهسازی و نمایش ویژگیهای اصلی یک شیء و پنهان کردن جزئیات غیرضروریه. فکر کنید به یک ریموت تلویزیون. شما فقط با دکمههای روی ریموت کار دارید و نیازی نیست بدونید داخلش چه اتفاقی میفته. یا وقتی ماشین میرونید، فقط با فرمون، پدالها و دنده سر و کار دارید و نیازی نیست بدونید موتور چطور کار میکنه.
هدف Abstraction در سیشارپ اینه که پیچیدگیهای غیرضروری رو پنهان کنه و فقط اطلاعات مهم و مرتبط رو نمایش بده. این کار باعث میشه کد سادهتر، قابل فهمتر و راحتتر برای استفاده بشه.
انتزاع به ما کمک میکنه تا:
چه مواقعی از انتزاع استفاده کنیم؟
انتزاع رو چطور در پروژهمون پیاده کنیم؟
در سیشارپ، میتونیم از
کلاسهای
abstract، interface ها، و متدهای virtual استفاده کنیم. این ابزارها به ما اجازه میدن تا
یک قالب کلی رو تعریف کنیم بدون اینکه جزئیات پیادهسازی رو مشخص کنیم.
مثال عملی: وسایل نقلیه
فرض کنید میخوایم یه
سیستم برای مدیریت انواع وسایل نقلیه بسازیم. میتونیم از انتزاع استفاده کنیم تا
یه رابط کلی برای همه وسایل نقلیه تعریف کنیم:
public abstract class Vehicle
{
public abstract void Start();
public abstract void Stop();
public virtual void Refuel()
{
Console.WriteLine("سوختگیری انجام شد");
}
}
public class Car : Vehicle
{
public override void Start()
{
Console.WriteLine("ماشین روشن شد");
}
public override void Stop()
{
Console.WriteLine("ماشین خاموش شد");
}
}
public class ElectricBike : Vehicle
{
public override void Start()
{
Console.WriteLine("دوچرخه برقی روشن شد");
}
public override void Stop()
{
Console.WriteLine("دوچرخه برقی خاموش شد");
}
public override void Refuel()
{
Console.WriteLine("باتری شارژ شد");
}
}
در این مثال، کلاس Vehicle یک قالب کلی برای همه وسایل نقلیه تعریف میکنه. کلاسهای Car و ElectricBike این قالب رو پیادهسازی میکنن. ما جزئیات داخلی هر وسیله نقلیه رو پنهان کردیم و فقط عملیاتهای اصلی رو نمایش دادیم.
انتزاع به ما کمک میکنه تا سیستمهای پیچیده رو سادهتر مدیریت کنیم و کد قابل فهمتر و انعطافپذیرتری بنویسیم.
از آنجایی که دو مفهوم انتزاع و ارثبری همیشه در مثالهایی که آورده می شود با همدیگر بکار می روند توضیحاتی در زیر اضافه می کنم تا این دو مفهوم از هم تفکیک داده شوند .
انتزاع (Abstraction) و ارثبری (Inheritance) دو مفهوم مرتبط اما متمایز در برنامهنویسی شیءگرا هستند.
بیایید این دو مفهوم را از هم تفکیک کنیم:
انتزاع (Abstraction)
انتزاع به معنای سادهسازی و پنهان کردن پیچیدگیهای غیرضروری است:
ارثبری (Inheritance)
ارثبری مکانیزمی برای استفاده مجدد از کد و ایجاد سلسله مراتب بین کلاسهاست:
تفکیک انتزاع و ارثبری
انتزاع میتواند بدون ارثبری وجود داشته باشد:
ارثبری میتواند بدون انتزاع وجود داشته باشد:
انتزاع و ارثبری اغلب با هم استفاده میشوند، اما هر یک مفهوم مستقلی دارند. انتزاع بر سادهسازی و پنهانسازی تمرکز دارد، در حالی که ارثبری بر به اشتراکگذاری و سازماندهی کد تأکید میکند.
ارثبری (Inheritance):
ارثبری یکی دیگر از ارکان اصلی برنامهنویسی شیءگرا است
که به ما اجازه میدهد یک کلاس جدید را بر اساس یک کلاس موجود ایجاد کنیم. این
مفهوم شبیه ارث بردن ویژگیها از والدین در دنیای واقعی است. مثلاً همانطور که
فرزندان برخی خصوصیات را از والدین خود به ارث میبرند، در برنامهنویسی هم یک
کلاس میتواند ویژگیها و رفتارهای کلاس دیگر را به ارث ببرد.
هدف ارثبری در سیشارپ:
چه زمانی از ارثبری استفاده کنیم؟
نحوه پیادهسازی ارثبری در سیشارپ:
در سیشارپ، از علامت دو
نقطه (:) برای نشان دادن ارثبری استفاده میکنیم. کلاسی که ارث میبرد را کلاس
فرزند یا مشتق شده، و کلاسی که از آن ارث برده میشود را کلاس والد یا پایه مینامیم.
مثال عملی: حیوانات
فرض کنید میخواهیم
سیستمی برای مدیریت حیوانات ایجاد کنیم:
public class Animal
{
public string Name { get; set; }
public int Age { get; set; }
public virtual void MakeSound()
{
Console.WriteLine("حیوان صدا میکند");
}
}
public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("سگ پارس میکند");
}
public void Fetch()
{
Console.WriteLine("سگ توپ را میآورد");
}
}
public class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("گربه میو میو میکند");
}
public void Scratch()
{
Console.WriteLine("گربه چنگ میزند");
}
}
در این مثال، Dog و Cat از Animal ارث میبرند. آنها Name و Age را به ارث میبرند و متد MakeSound را بازنویسی میکنند. همچنین هر کدام متد خاص خود را دارند.
ارثبری به ما کمک میکند تا کد تمیزتر، قابل استفاده مجدد و ساختاریافتهتری بنویسیم. این مفهوم یکی از ابزارهای قدرتمند در طراحی و پیادهسازی سیستمهای نرمافزاری پیچیده است.
با عرض پوزش از اینکه در فایل قبلی که برای دانلود تقویم قرار داده بودم یک فایل کتابخانه ای از قلم افتاده بود و بخاطر همین کار نمی کرد . در این پست دو تقویم برای دانلود گذاشته ام.
تقویم روزانه :
با دانلود این تقویم بسیار کم حجم می توانید تاریخ شمسی قمری و میلادی هر روز را روی دسکتاپ خو د داشته باشید و هر کدام را که نخواستید می توانید با یک کلیک بردارید .
تقویم روزانه مخصوص دسکتاپ را می توانید از اینجا دانلود کنید.
تقویم سالانه :
یک تقویم دیگر را هم می توانید با کلیک روی تصویر پائین دانلود کنید. بزودی یک تقویم کاملتر نیز برای دانلود قرار می دهیم.
در این پست برای علاقه مندان به سی شارپ کدی داریم که در آن با زدن یک کلید تاریخ و ساعت دقیق سیستم با یک شی از تاریخ و ساعت از قبل تعیین شده مقایسه شده و سه حالت ممکن برای آن پیش بینی شده که به ترتیب زیر می باشند .
اول اگر که اختلاف تاریخ جاری سیستم با تاریخ تعیین شده بیش از یک ساعت باشد رنگ لیبل روی فرم سبز می شود.
دوم : اگر اختلاف زمان بین تاریخ جاری سیستم با تاریخ تعیین شده کمتر از یک ساعت باشد رنگ لیبل زرد می شود .
سوم : و نهایتا در صورتی که تاریخ سیسم از تاریخ تعیین شده گذشته باشد و بهبارت دیگر تاریخ و ساعت سیستم از تاریخ و ساعت تعیین شده بزرگتر باشد رنگ لیبل قرمز می شود .
متن کد در زیر آمده :
namespace zaman
{
public partial class Form1 : Form
{
private DateTime specificDate;
public Form1()
{
InitializeComponent();
specificDate = new DateTime(2024, 11, 16, 15, 30, 0); // سال، ماه، روز، ساعت، دقیقه، ثانیه
}
private void button1_Click(object sender, EventArgs e)
{
// دریافت تاریخ و زمان جاری سیستم
DateTime currentDate = DateTime.Now;
// محاسبه فاصله زمانی بین تاریخ جاری و تاریخ تعیین شده
TimeSpan timeDifference = specificDate - currentDate;
// بررسی شرایط مختلف
if (timeDifference.TotalHours > 1) // اگر فاصله بیش از یک ساعت باشد
{
label1.Text = "شما هنوز فرصت دارید.";
label1.BackColor = Color.Green; // رنگ سبز
}
else if (timeDifference.TotalHours <= 1 && timeDifference.TotalSeconds > 0) // اگر فاصله کمتر از یک ساعت است و هنوز نرسیدهایم
{
label1.Text = "شما کمتر از یکساعت تا اتمام زمان فرصت دارید.";
label1.BackColor = Color.Yellow; // رنگ زرد
}
else // اگر از تاریخ گذشتهایم
{
label1.Text = "مهلت شما به اتمام رسیده.";
label1.BackColor = Color.Red; // رنگ قرمز
} } } }
معرفی کلاس رگولار (Regular Class)
مقدمه
در درسهای قبلی به معرفی انواع دادهها در زبان برنامهنویسی سیشارپ پرداختم. به جای تکرار توضیحات مفصل درباره انواع عددی که اکثر علاقهمندان به برنامهنویسی با آنها آشنا هستند، تصمیم گرفتم به بررسی کلاسها بپردازم. در این درس، نوع کلاس معمولی یا "رگولار" (Regular Class) رو معرفی میکنم که یکی از مهمترین و پرکاربردترین ساختارها در سیشارپ است.
نوع کلاس (Regular Class)
کلاسها در سیشارپ الگوهایی هستن که برای ایجاد اشیاء (Objects) استفاده میشن. یه کلاس معمولی میتونه دادهها (فیلدها) و رفتارها (متدها) مربوط به یه موجودیت خاص رو تعریف کنه. این ساختار به برنامهنویس اجازه میده تا ویژگیها و عملکردهای یه شیء رو بهصورت سازمانیافته کنار هم قرار بده.
ویژگیهای کلاس
کلاسها میتونن شامل موارد زیر باشن:
فیلدها (Fields): متغیرهایی که وضعیت یا اطلاعات شیء رو نگه میدارن (مثل رنگ یا مدل یه خودرو).
متدها (Methods): عملکردهایی که رفتار شیء رو مشخص میکنن (مثل حرکت کردن یا توقف یه خودرو).
برای مثال، اگه بخواهیم یه کلاس برای یه خودرو تعریف کنیم، میتونیم فیلدهایی مثل Color (رنگ)، Model (مدل) و Year (سال تولید) داشته باشیم و متدهایی مثل Drive() (حرکت)، Stop() (توقف) و ChangeGear() (تغییر دنده) رو پیادهسازی کنیم.
یادآوری مهم
کلاسها در سیشارپ شباهتهایی با انواع داده ساده (مثل اعداد) دارن، چون هر دو برای ذخیره اطلاعات استفاده میشن. اما تفاوت کلیدی اینه که کلاسها امکانات بیشتری مثل تعریف رفتار، سازماندهی دادههای پیچیده و استفاده از مفاهیم شیءگرایی (مثل کپسولهسازی و وراثت) رو فراهم میکنن.
سازماندهی و اجرا
کلاسها به ما کمک میکنن تا دادهها و رفتارهای مرتبط با یه شیء رو توی یه ساختار منظم و قابلفهم سازماندهی کنیم. در حالی که یه نوع داده عددی (مثل int) فقط یه مقدار ساده رو نگه میداره، یه کلاس میتونه چندین نوع داده مختلف رو کنار هم داشته باشه و عملیات پیچیدهتری رو اجرا کنه. مثلاً، یه کلاس Car میتونه شامل فیلدهای Color (رشته)، Model (رشته) و Year (عدد صحیح) باشه و متدهایی مثل Drive() و Stop() رو برای مدیریت رفتار خودرو پیادهسازی کنه.
نگهداری انواع مختلف داده
یکی از مزیتهای بزرگ کلاسها اینه که میتونن انواع مختلف داده رو توی خودشون نگه دارن. این ویژگی باعث میشه اطلاعات مرتبط با یه شیء بهصورت منسجم ذخیره بشن و کد خواناتر و قابلنگهداریتر بشه. مثلاً، یه کلاس میتونه یه عدد صحیح برای سال تولید (Year)، یه رشته برای مدل (Model) و یه رشته دیگه برای رنگ (Color) داشته باشه.
مثال ساده از یک کلاس رگولار
در زیر یه نمونه ساده از کلاس Car رو میبینید که شامل یه فیلد، یه سازنده و یه متد است:
public class Car
{
private Label outputLabel; // فیلدی برای نگهداری مرجع به یک لیبل که پیامها را نمایش میدهد
public Car(Label label) // سازنده کلاس که یک لیبل را بهعنوان پارامتر میگیرد
{
outputLabel = label; // مقدار پارامتر ورودی را به فیلد اختصاص میدهیم
}
public void Start() // متدی برای شبیهسازی استارت خودرو و نمایش پیام
{
outputLabel.Text = "Car started."; // متن "Car started." را در لیبل نمایش میدهیم
}
}
توضیح مثال:
فیلد outputLabel: یه متغیر خصوصی از نوع Label (که معمولاً توی برنامههای Windows Forms استفاده میشه) برای نمایش پیامها.
سازنده Car: هنگام ساخت شیء، یه لیبل رو میگیره و به فیلد outputLabel اختصاص میده.
متد Start: وقتی فراخوانی بشه، متن "Car started." رو توی لیبل نشون میده.
نحوه استفاده:
Label myLabel = new Label(); // فرض کنید این لیبل توی فرم تعریف شده
Car myCar = new Car(myLabel); // ساخت یه نمونه از کلاس Car
myCar.Start(); // اجرای متد Start و نمایش پیام در لیبل