مشاهده نسخه کامل
: همه چیز در مورد کلاس
mojtaba-design
28-05-2009, 06:34
به نام خدا
دوستان با توجه به اینکه فکر میکنم ، عده ای از دوستان مفهموم کلاس را درک نمی کنند (+ خودم) تصمیم گرفتم که تاپیکی ایجاد کنم ، که هم مشکل ما حل بشه و هم منبع مفیدی در بیاد.
انشاء الله در آخر و بعد از جمع بندی به صورت یک مقاله جامع خدمت دوستان قرار میدهیم .
فقط لطفا موارد زیر را جهت منحرف نشدن موضوع رعایت کنید :
1- از دادن پست تکراری یا احوالپرسی خودداری کنید ( برای تشکر هم الحمدالله دکمه به همین نام برای پست ها وحود دارد)
2- سوال نا مربوز نپرسید + اگه سواللی دارید بگزارید در انتهای هر بخش بپرسید ، چون ممکن است به جوای سوال شما تا آخر فصل برسیم.
پیشاپش از همکاری شما ممنونیم
و در ضمن دوستان کنار نشینند نطاره کنند ، دست بکار شید ، هر کجا توضیحی اضافی وجود داشت یا اشکالی در توضیحات بود تکمیل و صلاح کنید.
ممنون:20:
سلام !
کلاس در حقیقت یک تعریف است ، تعریفی که به شرح یک الگومیپردازد سپس شما الگو ها را با استفاده از شرح شناخته و به کار میبندید .
mojtaba-design
29-05-2009, 04:37
سلام!
یک تعریف دیگه هم اگه میشه بگید.
shahrokhkian
30-05-2009, 09:05
کلاس موجودیتی است که می تواند شامل داده ها و رویه ها باشد به عبارت دیگر کلاس متشکل از یکسری داده و رویه هاست که داده های مربوط به کلاس را اصطلاحاً "فیلد" و رویه های مربوط به کلاس را "متد" می نامند. تعریف کلاس در قسمت Type واحد یا برنامه صورت می گیرد. پس از تعریف یک کلاس می بایست یک نمونه اجرایی از آن ایجاد نمود.این نمونه اجرایی را "شیء" می نامند. پس کلاس پایه و اساس برنامه نویسی شی گرا است. الگوی تعریف کلاس در دلفی به شکل زیر است.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنیدتمام کلاسها در دلفی ، کلاس TObject را به عنوان والد دارند. این بدین معنی است که اگر در دلفی والد کلاس را مشخص نکنید باز هم طبق پیش فرض ، کلاس مورد نظر از کلاس TObject مشتق خواهد شد. پس از تعریف داده ها مهمترین بخش ، ایجاد و طراحی متدهایی است که تعیین کننده رفتار شیء مورد نظر می باشند. تعریف متدهای اشیا در دلفی با الگوی زیر صورت می پذیرد.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنیددرمورد انواع متدها و ساختار کلاس بعداً به صورت مفصل بحث خواهیم کرد.
موفق باشید.
mojtaba-design
31-05-2009, 04:51
ممنون ، خیلی خوب توضیح دادید،
درمورد انواع متدها و ساختار کلاس بعداً به صورت مفصل بحث خواهیم کرد.
مشتاق توضیحات مفصل شما هستیم!
mojtaba-design
01-06-2009, 09:21
بسیار خوب دوستان لطف کردند و تعریف خوبی رو از کلاس ارائه دادند ( پست شماره 4)
و همچنین الگو تعریف آن نیز به شکل زیر است :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
خوب بخش نارنجی رنگ ، به ما میگه که کلاس والد چی باشه.(بعدا کلاس والد و مشتق رو توضیح میدهم)
و بخش سبز رنگ ،نام دلخواهی است که به کلاس مشتق شده میدهیم.همانطور که دوست عزیزمون گفتند این در صورتی که والد را مشخص نکنیم خود دلفی TObject رو که جد همه کلاس ها است رو انتخاب میکنه.
کلاس در بخش type و همچنین با کلمه کلیدی class تعریف میشه و با کلمه کلیدی end به پایان میرسه.
هر کلاس میتونه شامل فیلد (متغیر که در کلاس تعریف شود را اصطلاحا فیلد گویند) و متد ها (به توابع و روال هایی که در کلاس تعریف شوند گویند) در سطوح دسترسی مختلف می باشد.
قبل از بررسی کلاس ها باید به بخش اشاره گر ها پرداخت :
اشاره گر : متغیری است که آدرس متغیر دیگری را در خود ذخیره می کند .اشاره گر ها به دو دسته نوع دار و بی نوع تقسیم میشوند.
اشاره گر بی نوع میتواند ادرس هر نوع متغیری را در خود ذخیره کند ، حال آنکه اشاره گر نوع دار فقط اشاره به نوعی خاص از متغیر میکند.
با استفاده از اشاره گر ها میتوانیم به طور غیر مستقیم به اطلاعات دسترسی داشته باشیم ، اشاره گر ها مزایایی دارند که به مرور با آنها اشنا می شوید.
الگو تعریف اشاره گر :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
که ما در دومین خط یک اشاره گر بدون نوع را تعریف کردیم و در خط سوم نشانه گر با نوع دقت کنید که عملگر ^ براش فهماندن اشاره گر بودن این متغیر به کامپایلر است و همچنین در خط سوم باید نوع اشاره گر را به جای type قرار دهیم مثل زیر :
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اشاره گر نوع دار از نوع عدد صحیح.
حال بپردازیم به سطوح مختلف دسترسی :
1- اختصاصی
2- عمومی
3- حفاظت شده
4- عام
1- اختصاصی : محدوده آن با کلمه کلیدی private شروع و تا کلمه کلیدی بعدی کلاس است. و محتویات این محدوده فقط توسط همین کلاس قابل استفاده است.
2- عمومی : محدوده آن با کلمه کلیدی Public شروع و تا کلمه کلیدی بعدی کلاس است. محتویات این محدوده در خود کلاس ،کلاس های مشتق شده و سایر کلاس ها وحتی در خارج از یونیتی که کلاس در آن تعریف شده ( با اضافه کردن کلمه کلیدی uses و نام بونیت کلاس) قابل استفاده است.
3- محافظت شده :حدوده آن با کلمه کلیدی Protected شروع و تا کلمه کلیدی بعدی کلاس است. محتویات این محدوده در خود کلاس و کلاس های مشتق شده قابل استفاده است.
4-عام :حدوده آن با کلمه کلیدی Published شروع و تا کلمه کلیدی بعدی کلاس است. این نوع برای نوشتن کنترل برنامه ها بکار می رود ،هر کنترلی که در اینجا تعریف شود در پنجره Object Inspector ظاهر میگردد.
خسته نباشید ، امیدوارم مفید بوده باشه ، منتظر بیقه اش باشید.:31:
منابع » خودم ، کتاب آموزش دلفی 5 نوشته کنت ریز دورف و ترجمه مهندس غنی زاده و سرهنگی
shahrokhkian
01-06-2009, 15:25
متدها
متدها رویه ها و توابع متعلق به کلاس مورد نظر هستند. آنها به جای داده ، عملکرد کلاس را ارائه می کنند. دو متد مهم کلاسهایی که ایجاد می کنیم متدهای "سازنده" و "تخریب کننده" هستند که پس از پایان بحث در مورد انواع متدها و تعریف آنها ، بصورت جداگانه و در یک پست دیگر به آنها خواهیم پرداخت. به غیر از این دو متد می توانیم متدهای سفارشی دیگری نیز برای اجرای مجموعه ای از تکالیف ایجاد کنیم.
همانگونه که قبلاً توضیح داده شد ایجاد یک متد یک فرآیند دو مرحله ای است. ابتدا باید متد را در اعلان کلاس اعلان نمود و سپس آن را به شکل کد تعریف نمود. توجه داشته باشید که متدها بصورت مستقیم به فیلدهای تعریف شده در کلاس دسترسی دارند.
انواع متدها
متدهای کلاس می توانند با نامهای static (ایستا) ، virtual (مجازی) ، dynamic (پویا) و message (پیام) اعلان شوند. برای مثال
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
متدهای ایستا
StaticProc یک متد ایستا (Static) است. متد ایستا نوعی روش پیش فرض است و مشابه رویه معمولی یا فراخوانی یک تابع عمل می کند. یعنی کامپایلر آدرس این متدها را می داند. بنابراین یک متد ایستا سریع اجرا می شود ولی توانایی override شدن برای ارائه "چندریختی" را ندارد.(override در ادامه توضیح داده خواهد شد.)
متدهای مجازی
VirtualProc یک متد مجازی (Virtua) است. متدهای مجازی همانند متدهای ایستا فراخوانی می شوند ، اما از آنجایی که قابلیت override شدن دارند کامپایلر برعکس متدهای ایستا ، آدرس این متدها را نمی داند. بنابراین ، کامپایلر یک "جدول متد مجازی Virtua Method Table " یا (VMT) می سازد که ابزاری جهت جستجوی آدرس های تابع در زمان اجرا ارائه می دهد. تمامی فراخوانی های متد های مجازی ، در زمان اجرا از طریق VMT صورت میگیرد. VMT متعلق به یک کلاس ، همه متدهای مجازی والد خود را نیز علاوه بر متدهای اعلان شده شامل می شود. در نتیجه متدهای مجازی نسبت به متدهای پویا از حافظه بیشتری استفاده میکنند اگرچه سریعتر اجرا می شوند.
متدهای پویا
DynamicProc یک متد پویا (Dynamic) است. متدهای پویا اساساً متدهای مجازی هستند اما سیستم فراخوانی آنها متفاوت است. کامپایلر یک شماره منحصر به فرد برای هر متد پویا در نظر می گیرد و برای ساخت یک "جدول متد پویا Dynamic Method Table " یا (DMT) از آن شماره ها در مورد آدرس های متد ، استفاده می کند. بر خلاف VMT یک DMT ، فقط شامل متدهای پویای اعلان شده در همان کلاس می باشد و آن متد برای باقی متدهای پویای خود به DMT های والد خود متکی است. به همین علت متدهای پویا نسبت به متدهای مجازی به شدت به حافظه کمتری نیاز دارند ، اما برای فراخوانی وقت بیشتری صرف می کنند چرا که ممکن است مجبور به تعمیم DMT های والد خود باشند.
متدهای پیامی
MessageProc یک متد اداره کننده پیام است. مقداری که پس از کلمه کلیدی message می آید ، نشان می دهد که متد به چه پیامی پاسخ خواهد داد. متدهای پیام برای ایجاد یک پاسخ خودکار به پیام های ویندوز بکار می روند و معمولاً مستقیماً فراخوانی نمی شوند. اداره کردن پیام خود مبحثی طولانی است که بعد پایان این تاپیک شاید تاپیکی با این عنوان باز کردیم.(البته با اجازه mojtaba-design عزیز)
فعلاً همین و دیگر هیچ ...
امیدوارم این پست مفید بوده باشد.
موفق باشید.
shahrokhkian
01-06-2009, 15:58
override
override کردن یک متد ، پیاده سازی مفهوم برنامه نویسی شی گرا از چندریختی ها در دلفی است. این روش به شما امکان می دهد تا عملکرد یک متد را از وارثی به وارث دیگر تغییر دهید.
متدهای دلفی فقط زمانی override می شوند که در ابتدای کار به عنوان dynamic یا virtual اعلان شده باشند. برای override کردن یک متد از کلمه کلیدی "override" به جای dynamic یا virtual در نوع کلاس وارث استفاده می کنیم. به عنوان مثال متوانیم متدهای DynamicProc و VirtualProc را به شرح ذیل override کنیم.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
overload
همانند توابع و رویه های معمولی ، متدها نیز می توانند طوری سربارگذاری (overload) شوند که یک کلاس بتواند چند متد هم نام با لیست های پارامترهای متفاوت را در برگیرد. متدهای سربارگذاری شده باید با کلمه کلیدی overload مشخص شوندنمونه کد زیر کلاسی را نشان می دهد که شامل سه متد سربار گذاری شده است.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
mojtaba-design
01-06-2009, 16:25
البته بنده اصلاح میکنم گفته دوست عزیزمون رو :
همانند توابع و رویه های معمولی ، متدها نیز می توانند طوری سربارگذاری (overloade) شوند که یک کلاس بتواند چند متد هم نام با لیست های پارامترهای متفاوت را در برگیرد. متدهای سربارگذاری شده باید با کلمه کلیدی overloade مشخص شوندنمونه کد زیر کلاسی را نشان می دهد که شامل سه متد سربار گذاری شده است.
به جای overloade از overload استفاده کنید.
shahrokhkian
01-06-2009, 16:32
با تشکر از mojtaba-design عزیز
پست اصلاح شد.
F A R H A D
03-06-2009, 16:07
سلام. خوب دارید پیش میرید. انشاله ادامه دار باشه
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در مورد این قسمت از کد لازم میدونم کمی توضیح بدم. به ارث بردن از کلاسی که قبلا تعریف شده Inheritance (وراثت) گفته میشه و یکی از مفاهیم بسیار کاربردی در برنامه نویسی شیء گرا هست. وراثت زمانی استفاده میشه که ما نیاز داریم تمامی اعضای یک کلاس رو داشته باشیم و علاوه بر اون اعضای مورد نظر خودمون رو اضافه کنیم، بدون اینکه بدونیم کلاس پایه به صورت درونی چه کاری انجام میده.
از خواص وراثت اینه که میتونیم از خاصیت ها و متد های یک کلاس که قبلا توسط یک برنامه نویس ایجاد شده استفاده کنیم، خاصیت ها و متد های مورد نظر خودمون رو اضافه کنیم و یا نحوه عملکرد متدها و خاصیت های تعریف شده در کلاس پایه رو تغییر بدیم.
فرض کنید کلاسی به نام دانشجو داریم. میتونیم کلاس دانشجوی کامپیوتر رو از روی کلاس دانشجو ایجاد کنیم و اعضای مختص این نوع دانشجو رو به کلاسمون اضافه کنیم.
به کلاسی که از کلاس دیگه به ارث گرفته میشه کلاس مشتق شده (Derived Class) و به کلاسی که کلاسهای دیگه از اون مشتق گرفته میشوند کلاس پایه (Base Class) گفته میشه
موفق باشید
mojtaba-design
05-06-2009, 06:55
1- اختصاصی : محدوده آن با کلمه کلیدی private شروع و تا کلمه کلیدی بعدی کلاس است. و محتویات این محدوده فقط توسط همین کلاس قابل استفاده است.
البته یک نکته مهم رو در مورد دسترسی اختصاصی فراموش کردم بگم :
قاعده بالا یک استثنا دارد ، هر گاه چند کلاس در یک یونیت تعریف شده باشند ،همه این کلاس ها حتی به قسمت اختصاصی همدیگر دسترسی دارند !
----------
سلام. خوب دارید پیش میرید. انشاله ادامه دار باشه
سلام ، انشاءالله.
در ضمن ممنون از اینکه تو بحث شرکت کردید.
shahrokhkian
11-06-2009, 16:49
سازنده (Constructor)
در دلفی نمونه ای از یک کلاس را با فراخوانی یکی از سازنده های (Constructor) آن ایجاد می کنیم.یک سازنده ، مسئول ایجاد یک نمونه از کلاس شما و تخصیص مقداری حافظه یامقداردهی اولیه به فیلدهای مورد نیاز است به طوریکه کلاس در حالت قابل استفاده قرار گیرد. کلاسها دردلفی همیشه حداقل یک سازنده دارند که Create نام دارد. (اگر چه یک کلاس می تواند بیش از یک سازنده نیز داشته باشد). بسته به نوع کلاس Create می تواند از پارامترهای گوناگونی استفاده کند. اگر برای یک کلاس سازنده ای درست نکنید می توانید هنگام ساخت کلاس ، از سازنده کلاس پایه استفاده نمایید. با توجه به این نکته که همه کلاسها در دلفی از کلاس TObject مشتق شده اند و این کلاس سازنده ای به نام Create دارد بنابراین اگر برای کلاس خود سازنده ای تعریف نکرده باشید می توانید از سازنده Create کلاس TObject برای کلاس خود استفاده نمایید.نام یک سازنده می تواند هر چیزی باشد اما باید آن را با لغت کلیدی Constructor اعلان نمود.در مثال زیر یک سازنده به کلاس TMyObject اضافه می شود.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید تعریف مربوط به سازنده نیز به شکل زیر صورت می گیرد
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید باید توجه داشت که سازنده متدی خاص بوده که مقداری را برنمی گرداند و چناچه سعی کنید یک نوع برگشتی به اعلان سازنده اضافه نمایید با پیغام خطای کامپایلر مواجه خواهید شد. همچنین مبحث Overload که قبلاً در مورد آن بحث شد را نیز می توانید برای سازنده ها نیز به کار ببرید.برای روشن تر شدن به اعلان زیر توجه نمایید.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید در دلفی سازنده ها به صورت خودکار فراخوانی نمی شوند و انجام این کار به عهده خود برنامه نویس است.فراخوانی یک سازنده به شکل زیر است.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنیدعمل فراخوانی یک سازنده برای ایجاد یک نمونه از یک کلاس را نمونه سازی (Instantiation) می نامند.
موفق باشید.
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.