مشاهده نسخه کامل
: آموزش برنامه نویسی شی گرا (#C)
MicrosoftH
04-07-2011, 19:02
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
آموزش برنامه نویسی شی گرا #C
در این تاپیک آموزش براساس سرفصل هایی که در زیر هست البته مفاهیم پیچیده تری نیز ارائه خواهد شد
برنامه نویسی شیء گرا:وراثت
1.مقدمه
2.کلاس های پایه و کلاس های مشتق
3.اعضای محافظت شده و داخلی
4.ارتباط بین کلاس پایه و کلاس مشتق شده
5.ساختار سه سطحی وراثت
6.متدهای سازنده و متدهای مخرب در کلاس های مشتق شده
7.مهندسی نرم افزار و وراثت
نکته:مفاهیم بنیادی برنامه نویسی شیءگرا برای این آموزش الزامی است
MicrosoftH
04-07-2011, 19:26
مقدمه
وقتی بجای نوشتن کامل یک کلاس،همراه با متغیر ها و متدها،آنرا از کلاسی دیگر مشتق کنیم که تمامی خصوصیات کلاس قبل را در کلاس جدید خواهد داشت کلاسی که یک کلاس دیگر را از آن مشتق کرده اید کلاس پایه(Base Class) نام دارد و کلاس جدید کلاس مشتق شده(Derived Class) نام دارد.
دو مفهوم هست که باید حتما با آنها آشنا شوید کلاس پایه مستقیم و غیر مستقیم
کلاس پایه مستقیم:کلاسی است که کلاس مشتق شده بطور مستقیم از آن مشتق شده است
کلاس پایه غیر مستقیم:کلاسی است که از دو یا چند سطح ساختار،مشتق شده است
وراثت چندگانه در C# برخلاف C++ پشتیبانی نمیشه حالا وراثت چندگانه یعنی چی یعنی یک کلاس از بیش از یک کلاس پایه مشتق می شود ولی نداشتن وراثت چندگانه در سی شارپ دلیل براین نیست که این ویژگی ها رو نداشته باشه در سی شارپ ما میتونیم از مزایای وراثت چندگانه استفاده کنیم بدون درگیری با مشکلات اون.
هر شی از کلاس مشتق شده،بعنوان یک یک شیء از کلاس پایه نیز محسوب می شود البته شیء مربوط به کلاس پایه فقط مختص آن کلاس است و مربوط به کلاس مشتق شده نیست فرض کنید ماشین جزء وسایل نقلیه است ولی هر وسیله نقلیه ماشین نیست
تجربه و آمار در تولید نرم افزار نشان داده که حجم زیاد کدها با موارد ذکر شده در برنامه نویسی شیء گرا ارتباط نزدیک دارد ساده تر بگم بدون استفاده از مفاهیم شیء گرا برنامه نویس در حجم زیادی از کدها خود را درگیر می کند و میشه گفت در قسمت های مختلف نرم افزار را در هاله ای از ابهام درگیر میکند در برنامه نویسی شی گرا ما بیشتر روی شی تمرکز داریم به این روند مفهوم انتزاعی می گوئیم
مفهوم دو جمله 'است' و 'دارد' وقتی می گوئیم است بیانگر مفهوم وراثت است یعنی یک کلاس از کلاس دیگر مشتق شده است "ماشین یک وسیله نقلیه است" در این مثال ماشین کلاس مشتق شده از وسیله نقیله(کلاس پایه) است اما دارد مفهوم ترکیب و ساخت را دارد یک شی از کلاس شامل یک یا چند آدرس شی بعنوان عضو می باشد ماشین یک فرمان دارد
دقت کنید احتمال دارد کلا س مشتق شده نیاز به دسترسی به متغیر،متدها،خصوصیت کلاس پایه خود باشد که میتواند به اعضای غیر خصوصی کلاس پایه خود دسترسی داشته باشد اگر لازم باشد بعضی از اعضا از کلاس پایه توسط کلاس مشتق شده قابل دسترسی نباشد میتوان آنرا خصوصی تعریف کرد.البته یک کلاس مشتق شده میتواند به اعضای خصوصی کلاس پایه دسترسی داشته باشد ولی نحوه آن دسترسی بسیار مهم است یک کلاس مشتق شده نمیتواند بصورت مستقیم به اعضای خصوصی کلاس پایه دسترسی داشته باشد بلکه باید با استفاده از اعضای غیر خصوصی کلاس پایه به اعضای خصوصی آن دسترسی پیدا کند
نکته: پنهان سازی اعضای خصوصی به برنامه نویس کمک می کند که برنامه را آزمایش،خطایابی،و بطور مستقیم تغییر بدهد اگر کلاس مشتق شده بتواند بطور مستقیم به اعضای کلاس پایه دسترسی داشته باشد آنگاه کلاس هایی که از کلاس مشتق شده،مشتق می شوند نمیتوانند به آن اعضا دسترسی داشته باشند
کلاس مشتق شده تمامی اعضا،متدها را به ارث می برد حتی اعضا و متدهایی که به آن نیاز ندارد وظیفه برنامه نویس است که در جین طراحی متدها و اعضایی را ایجاد کند که بعدا توسط کلاس مشتق شده قابل استفاده باشد اغلب کلاس های مشتق شده احتیاج به متد یا خصوصیاتی دارد که بتواند عملکرد متد کلاس پایه را بهینه قرار دهد.
MicrosoftH
05-07-2011, 11:13
کلاس های پایه و مشتق
اغلب یک شی از یک کلاس بعنوان شی از کلاس دیگر نیز محسوب می شود یک مربع یک چهار ضلعی به حساب می آید
پس کلاس مربع میتواند از چهار ضلعی مشتق شود و میدانیم هر چهار ضلعی مربع نیست پس هر شی از کلاس مشتق شده یک شی از کلاس پایه است و یک کلاس پایه میتواند چندین کلاس مشتق شده داشته باشد بهمین خاطر اشیائی که توسط کلاس پایه ارائه می شوند بزرگتر از اشیائی هستند که توسط کلاس مشتق شده ارائه می شوند فرض کنید کلاس پایه وسایل نقلیه ارائه دهنده تمام وسایل نقلیه می باشد مانند ماشین،دوچرخه و .. در کلاس مشتق شده دوچرخه فقط یک زیر مجموعه از وسایل تقلیه است ارتباط وراثتی را می توانیم مانند ساختار درختی در نظر بگیریم یک کلاس با تمام کلاس های مشتق شده از آن در یک ساختار قرار میگیرند یک کلاس در صورتی کلاس پایه محسوب می شود که خصوصیات و متدهای آن توسط کلاس های دیگر مشتق شده باشد.
مثال:
دانشگاه دارای هزاران عضو میباشد شامل: کارمندان،دانشجویان،فارغ التحصیلان و...کارمندان میتوانند هیئت علمی دانشگاه یا پرسنل اداری باشند هیئت علمی خود میتواند شامل مدیر ارشد،استادان باشد به ساختار سازمان دانشگاه توجه کنید
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
هر فلش در ساختار نماد یک است یعنی می توانیم بگوئیم که یک کارمند عضو هیئت علمی دانشگاه است. کمیته دانشگاه یک کلاس پایه از کارمندان ،دانشجویان و فارغ التحصیلان است همچنین عضو کمیته دانشگاه یک کلاس پایه غیر مستقیم از تمام کلاس های موجود در ساختار درختی میباشد خب با توجه به مثال در C# مدیر ارشد یک شیء محسوب می شود چرا که در C# تمام کلاس های مستقیم و یا غیر مستقیم یک شیء میباشند همچنین تمام کلاس های موجود در C#،در یک ساختار درختی قرار دارند
در مفهوم وراثت،اعضای خصوصی یک کلاس پایه نمی توانند توسط کلاس مشتق شده از آن مورد استفاده قرار گیرندو این درحالی است که این اعضای خصوص توسط کلاس مشتق شده،ارث برده شده اند تمامی اعضای کلاس پایه،وقتی که عضوی از کلاس مشتق شده می شوند دسترسی به اعضای اصلی خود را حفظ می کنند اعضای عمومی کلاس پایه،در کلاس مشتق شده بصورت عمومی میباشند همچنین اعضای محافظت شده در کلاس پایه بصورت محافظت شده در کلاس مشتق شده محسوب می شوند
کلاس مشتق شده میتواند به اعضای خصوصی کلاس پایه با شرایط خاصی دسترسی داشته باشد با کلاس پایه و مشتق شده میتوانیم عملکردهای مشابهی داشته باشیم و عمومیت آنها در متغیر ها و متدهای کلاس پایه نمایان می شود
نکته:متدهای سازنده هیچ وقت ارث برده نمی شوند و خاص کلاس هایی هستند که در آن تعریف می شوند
MicrosoftH
07-07-2011, 10:58
اعضای محافظت شده و داخلی
میدانیم که اعضای عمومی در هرجایی از کلاس قابل دسترسی است در این بخش ما در مورد متغیرهای محافظت شده و داخلی صحبت می کنیم.
متغیرهای محافظت شده:سطح واسطی میان متغیرهای عموممی و متغیرهای خصوصی است یک متغیر محافظت شده فقط توسط کلاس پایه یا کلاس مشتق شده از کلاس پایه قابل دسترسی است
متغیرهای داخلی:اعضای داخلی یک کلاس پایه،فقط توسط اشیایی قابل استفاده میباشد که از همان گروه بخاطر داشته باشید که اگر اعضای داخلی در جای دیگر تعریف شوند آنگاه در آن گروه قابل دسترسی میباشند کلاس های مشتق شده به راحتی می توانند به اعضای عمومی محافظت شده و داخلی توسط نام آنها دسترسی داشته باشند
وقتی که متد یک کلاس مشتق شده،یک عضو کلاس پایه را دوباره نویسی می کند آنگاه عضو کلاس پایه می تواند از کلاس مشتق شده،قابل دسترسی باشد البته جلوی اسم کلاس پایه کلمه کلیدی Base آمده باشد و بعد از این کلمه اپراتور "." قرار گیرد(در مورد کلمه کلیدی base بحث خواهیم کرد
anvar.net
09-07-2011, 14:56
دوست عزیز , از زحمتی که برای اموزش بچه های این انجمن می کشی ممنون,
یه پیشنهاد کوچولو هم داشتم : اگه امکان پذیر پذیر هست فقط مسائل تئوریک رو مطرح نکنید و همین مطالب رو هم با کد و مثال های واقعی همراه کنید. معمولا افرادی که تازه شروع به اموزش می کنند به همان اندازه که نیاز به تشریح مسائل دارند نیاز به نمونه های کدهای مرتبط دارند که بهتر بتونند مفاهیم رو متوجه بشند. مفاهیم شی گرایی هم خارج از این مقوله نیستند
با ارزوی موفقیت برای شما
MicrosoftH
11-07-2011, 11:32
خیلی ممنون از تذکرتون خودم میخواستم ولی متاسفانه مشکلی برام پیش اومده برای همین نتونستم کدهایی رو بنویسم یا مطالب رو بازم بزارم ادامه کار چشم حتما
MicrosoftH
11-07-2011, 11:55
class point
{
private int x, y;
public point()
{
}
public point(int xValue, int yValue)
{
x = xValue;
y = yValue;
}
public int X
{
get { return x; }
set { x = value; }
}
public int Y
{
get { return y; }
set { y = value; }
}
}
در این کدها همانطور که مشادهده میکنید x,y بصورت خصوصی تعریف شده اند با واژه Private خب در بحث مهندسی نرم افزار بهتر است متغیرها بصورت خصوصی ترعیف شده و بصورت عمومی مقدار بگیرند که اینکار با استفاده از متغیرهای عمومی
X,Y امکان پذیر است
public int X
{
get { return x; }
set { x = value; }
}
در این قسمت با استفاده از متد Get مقداری بازیابی شده و با استفاده از set مقداری به متغیر x که بصورت خصوصی تعریف شده نسبت داده می شود
خب میخواهیم در فرم اصلی برنامه از این کلاس استفاده کنیم یک متغیر از نوع کلاس را تعریف می کنیم
point pnt = new point(12, 21);
خب حالا متغیری از نوع کلاس تعریف شده و دومقدار را برای سازنده کلاس ارسال میکنیم
با استفاده از pnt.x به مقدار متغیر x(خصوصی) دسترسی پیدا می کنیم و با استفاده از pnt.X=45 مقدار آنرا تغییر میدهیم با بازیابی مقدار متد Get متغیر عمومی X دستور Return x; اجرا میبشود و با pnt.X=45 متد Set متغیر عمومی X با دستور x=value مقدار متغیر x(خصوصی) تغییر پیدا میکند
ghahremanimehdi
11-07-2011, 11:56
اگر ممکنه در خصوص مباحث زیر توضیح بدید (با کد و مثال شهودی)
Delegates - Events- Call Back Method- Polymorphism-Overloading-Generic
MicrosoftH
11-07-2011, 12:59
جنريک ها به منظور ايجاد قابليتهاي جديدي همچون حذف نياز به Casting يا تخصيص نوع، افزايش ايمني متغييرها، کاهش اثر Boxing و همچنين براي آسانتر کردن ايجاد کلاسها و متدهاي عمومي (Generalized) به 2.0 C# اضافه شدند. به عبارت ديگر اين قابليت جديد به شما اجازه مي دهد تعريف دقيق يک نوع داده (datatype) را تا زمان ايجاد يک نمونه از نوع جنريک به تعويق بيندازيد. به اين ترتيب يکي از بزرگترين مزاياي استفاده از جنريکها بالاتر بردن ميزان بازدهي برنامه است.
کلاسهاي جنريک و متدهاي آن پارامترهاي نوعي (Type Parameter) در خود مي پذيرد که مشخص کننده نوع اشيايي است که در حال کار با آنها مي باشد. در اين قسمت با يک مثال به طرح مشکل و راه حل آن با استفاده از جنريکها مي پردازيم.
به قطعه کد زير توجه کنيد(مشکل) :
public class Customer
{
public void AddDetailItem( object detailItem )
{
if (detailItem is OrderItem)
PerformAction( (OrderItem)detailItem );
if (detailItem is CalendarEvent)
AddCalendarEvent( (CalendarEvent)detailItem);
...
}
}
همانگونه که در بالا مي بينيد، با قرار دادن ifهاي متعدد ، سعي شده که کارآيي هاي مختلف و مورد نظر از برنامه گرفته شود، در حالي که به سادگي مي توان با استفاده از پارامترهاي نوعي و جنريکها کاربرد دقيق کلاس Customer را در زمان نمونه گيري از کلاس انجام داد: (راه حل):
public class Customer<T>
{
public void AddDetailItem( T detailItem )
{
...
}
}
به عبارت ديگر پارامتر واقعي يک کلاس جنريک در هنگام نمونه گيري از آن کلاس ايجاد مي گردد:
Customer<OrderItem> customer=new Customer<OrderItem>();
از ديگر خواص جالب توجه کلاسهاي جنريک اين است که مي توان نوع پارامترهايي را که به کلاس ارسال مي شوند، محدود نمود. به اين منظور از کليد واژه where استفاده مي شود که به دنبال آن نوعهاي قابل قبول براي کلاس تعريف مي گردند. به عنوان نمونه در مثال زير پارامتر نوعي T بايد اينترفيسهاي ISerializable و IComparable را پياده سازي نمايد:
public class myCollection<T> where
T: ISerializable,
T: IComparable
ه طور کلي سه نوع محدوديت که بايد به عنوان محدويتهاي خاص از آنها نام برد عبارتند از:
class: نشان مي دهد که پارامتر بايد از نوع Reference يا Reference Type باشد.
struct: پارامتر بايد از نوع Value type باشد.
()new: پارامتر بايد داراي يک سازنده يا constructor بدون پارمتر ورودي باشد.
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.