کلاسهای abstract یکی از ابزارهای مهم شی گرایی است .کلاسهایی که نمی توان از آنها متغیری ساخت . و بصورت کلی دارای ساختار زیر هستند .
Abstract class classname
{
بدنه کلاس
}
اما کلاس abstract چگونه است ؟
1-یک کلاس abstract شبیه یک کلاس معمولی است . متد ، فیلد و خصوصیت دارد با این تفاوت که نمی توانیم از آن نمونه سازی کنیم ، به عبارتی نمی توانیم متغیری از نوع کلاس abstract تعریف کرد .
2-یک کلاس abstract شبیه یک اینترفیس است ، اما با دیدی وسیعتر (مفصلا توضیح خواهم داد )
3 -یک کلاس abstract می تواند دارای متدهای abstract باشد که شبیه اینترفیس فقط اعلام می شوند و باید در زیر کلاسها بازنویسی شوند و جزییات آنها نوشته شود .
abstract class Location
{
public abstract Location(string name);
{
اگر دقت کنیم ، کلاس abstract حالتی بین کلاس معمولی و یک Interface است . که برای فهم کامل آن باید مقایسه ای با Interface انجام دهیم تا تفاوت این دو بیشتر برای ما مشخص شود .
1-یک کلاس معمولی فقط می تواند از یک کلاس abstract ارث بری کند . در حالی که همان کلاس معمولی می تواند از چندین Interface ارث بری کند ( وراثت چند گانه )
2-یک Interface فقط می تواند اعلان متدها و خصوصیتها را داشته باشد اما یک کلاس abstract علاوه بر انها می تواند متدها و خصوصیتهایی با کدهای کامل داشته باشد .
مثال :
abstract class Location
{
public Location(string name)
{
this.name = name;
}
public Location[] Exits;
private string name;
public string Name
{
get { return name; }
}
}
3-عناصر یعنی متدها و خصوصیتها و .. در کلاس abstract می توانند همانند یک کلاس معمولی دارای سطح دسترسی باشند . بر خلاف Interface
4-وقتی شما متدی را به کلاس abstract اضافه می کنید در صورتی که متد شما از نوع abstract نباشد ، اتوماتیک به تمام زیر کلاسها اعمال می شود ، اما در Interface اگر متدی اضافه کنید باید در تمام زیر کلاسها آن را اعمال کنید و جزییات آن را مشخص کنید .
5-کلاسهای abstract مانند یک کلاس معمولی می توانند فیلد و عناصر داشته باشند در حالی که Interface فاقد این خصوصیت است .
حتما شما هم نیاز دارید به ایجاد برنامه ای تحت ویندوز که با بانک اطلاعاتی sql_server کار می کند ، شاید در رشته اتصال نام سرور را local تعریف کنید ولی برخی مواقع جواب نمی دهد برای فهمیدن نام سرور بانک اطلاعاتی در هر رایانه می تواند از ریجستری اطلاعات را خواند سورس زیر با سی شارپ اینکار را براحتی انجام می دهد
ابتدا فضای نام
using Microsoft.Win32
را به پروژه خود اضافه کنید سپس فرمی ایجاد کنید با یک کنترل لیبل ساده ، حالا در رویداد load مربوط به فرم سورس زیر را بنویسید :
private void Form1_Load(object sender, EventArgs e)
{
RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server");
if (instances.Length > 0)
{
foreach (String element in instances)
{
if (element == "MSSQLSERVER")
this.label1.Text=System.Environment.MachineName;
else
this.label1.Text=System.Environment.MachineName + @"\" + element;
}
}
}
اکنون برنامه را اجرا کنید تا نتیجه را ببینید
یکی از مفاهیم شی گرایی ، مبحث Interface ها است . مفهمومی که با وجود ساده بودن ، اما کاربردهای فراوانی دارد . در این مختصر می خواهم مفهموم و دلایل کاربردهای Interface ها را بیان کنم .
Interface چیست ؟
Interface را نمی توان کلاس نامید . هر چند در سلسله مباحث کلاسها مورد بررسی قرار می گیرد . اما می توان آن را قانونی در نظر گرفت که بر روی کلاسها ، اعمال میشود . در واقع Interface قراردادی است . که به موجب این قرار داد ، برخی زیر کلاسهای برنامه ما موظفند از بندهای این قرارداد استفاده کنند . با این تفاوت که ما در Interface فقط کلیات قرار داد را ذکر می کنیم و جزییات را به عهده زیر کلاسها می گذاریم.
مهمترین نکته ها در مورد Interface :
1-وقتی ما از Interface استفاده می کنیم زیر کلاسی که از Interface ارث بری می کند ، باید و باید و باید ، تمام متدها و خصوصیات Interface را اعمال کند (override) در غیر اینصورت با پیغام خطا مواجه می شویم.
2-یک کلاس فقط می تواند از یک کلاس دیگر ارث بری کند ، اما یک کلا س می تواند از چندین Interface ارث بری کند ( در مورد مفهموم ورراثت چند گانه خواهم نوشت )
3-Interface محدوده ای از متدهایی را تعریف می کند که چنانچه کلاسی از آن ارث بری کند باید تمام آنها را اعمال کند
4-تعریف Interface شبیه تعریف کلاس است با این تفاوت که در Interface بدنه متدها و خصوصیتها نوشته نمی شود و فقط نوع پارامترها ی ارجاعی و بازگشتی مشخص می شود.
5-Interface نمی تواند داده ها را ذخیره کند ، شما نمی توانید برای Interface فیلد تعریف کنید . شما فقط می توانید یک تعریفی کلی از خصوصیت و متدها را اعلام کنید .
6-ما نمی توانیم متغیری از نوع Interface تعریف کنیم .
7- Interface می تواند از Interface دیگری ارث بری کند . در این حالت کلاسی که از Interface فرزند ارث بری می کند ، باید تمام خصوصیات و متدهای Interface والد و فرزند را اعمال کند .
در زیر یک مثال از Interface می آوریم ، Interface با کلمه Interface تعریف می شود . خوب Interfaceی به صورت زیر تعریف می کنیم :
interface Icol
{
{; string Funny { get
void Honk();
}
همانطور که در بالا تعریف کردیم ما Interfaceی به نام مثلا به نام Icol تعریف می کنیم ، این Interface دارای متد honk و دارای خصوصیت funny است . همانطور که می بینید ، فقط اعلان شده اند و هم متد و هم خصوصیت فاقد بدنه هستند .
حال باید کلاسی تعریف کنیم که Interface بالا را ارث بری کند و متدها و خصوصیت در آن اعمال شوند .
class TallGuy : Icol
{
public string Name;
public int Height;
public void TalkAboutYourself()
{
MessageBox.Show("My name is " + Name + " and I’m "
+ Height + " inches tall.");
}
public string Funny
{
get { return "big shoes"; }
}
public void Honk()
{
MessageBox.Show("Honk honk!");
}
}
خوب همانطور که می بینید کلاس ما علاوه بر ارث بری از Interface ، متدها و خصوصیتهای آن را با بدنه دوباره تعریف می کند .
در مقاله بعد در مورد کلاس abstract class خواهم نوشت .