دوره مجازی #C (جلسه 10): آشنایی با Interface، Enumeration و لیست ها

دسته بندی: برنامه نویسی
زمان مطالعه: ۱ دقیقه
۱۸ مرداد ۱۳۹۴

در این جلسه مباحث تکمیلی و به جا مانده از مباحث گذشته را مطرح خواهیم کرد که شامل معرفی Interface، Enumeration و لیست ها و ارائه ی مطالب تکمیلی پیرامون مباحث Method Overloading و Method Overriding و همینطور مبحث Abstraction خواهد بود. همینطور با بیان مثال های کاربردی سعی می کنیم، مطالب ارائه شده را به شکل عملی مورد بررسی قرار دهیم.

مطالب آموزش داده شده در این جلسه به قرار زیر می باشند:

  • Method Overloading
  • Method Overriding
  • آشنایی با Interface
  • معرفی Enumeration
  • پیاده سازی Interface ها
  • بررسی عمیق تر و دقیق تر Property ها
  • پیاده سازی یک پروژه ی ساده ی بانکداری
  • آشنایی با Class Diagram
  • معرفی Array list
  • آشنایی با حلقه ی foreach و پیمایش با استفاده از آن بر روی لیست ها
  • پیاده سازی یک پروژه ساده دیکشنری با استفاده از لیست ها

در جلسه ی آینده با مفاهیم پیشرفته تری همچون مبحث Generic ها و مسئله ی Sorting آشنا می شویم.

:: توجه

این مطلب یک جلسه از دوره آموزش #C می باشد و برای مشاهده آن باید در دوره ثبت نام کنید.

ثبت نام در دوره آموزش #C

نویسنده

جلسات دوره

نظرات کاربران

پژمان

سلام دوباره. جناب زارعی در مثال MyDictionary ابتدا به ساکن گمان میکردم که همچون مثال XOBorad کلاس Word رو بصورت آرایه ای در constructor کلاس MyDictionary فراخوانی خواهید کرد ولی از اونجا که دایره لغات نامحدودن این کار انجام نشد و با معرفی متغیری دیگر به نالم Words از نوع ArrayList در کلاس MyDictionary ودر هنگام فراخوانی متد Add ، کلاس Word رو به صورت لوکال فراخوانی کرده و مقدار دهی نموده اید و این کاملا سیر منطقی داره و قابل قبوله…. . پیشنهادی دارم، آیا امکانپذیرهست که کلاس Word رو به عنوان فرزند کلاس ArrayList معرفی کرده و از انجا که متد Add در کلاس ArrayList بصورت Virtual میباشد این متد رو درون کلاس Word بصورت override بازسازی کرد و آنگاه حال که به این متد درون خود کلاس Word دسترسی داریم همین کلاس Word را با ساختن آبجکتی بصورت آرایه ای از نوع کلاس Word (همچون مثال XOBorad)،درون کلاس MyDctionary ایجاد و با یک حلقه مراقبت- کنترل تکرار و معرفی یک متغیر Enum به عنوان SentinelValue در constructor کلاس MyDictionary دیکشنری رو مقدار دهی کرد؟ البته روش شما هم راه حل خوبی هست اما به طرز عجیبی احساس میکنم این مثال شبیه به مثال XOBoard باید حل بشه. ممنون از پاسخ شما

آرین زارعی

سلام دوست عزیز.
با توجه به نوع مثال میشه راه حال های مختلفی ارائه داد. فکر کنم منطورتون این هست که کلاس MyDictionary رو فرزند کلاس arraylist معرفی کنیم. درست میگم؟ اگر اینطور باشه در نگاه اول به نظر درست میاد. این خیلی خوب هست که راه حل های متفاوت و صحیح به ذهنتون میرسه. سعی کنید حتما پیاده سازی کنید اون ها رو چرا که خیلی از مشکل ها اگر وجود داشته باشند در مرحله ی تست کردن ظاهر میشن و به صورت تئوری سخت میشه پیداشون کرد. ولیکن همیشه سعی کنید تا حد ممکن ساده ترین راه حل ممکن رو انتخاب کنید از هر نظر
موفق باشید

پژمان

سلام جناب زارعی . ضمن تبریک پیشاپیش عید نوروز 96 برای شما و تیم پرتلاش و موفق سون لرن
دو سه ابهام دارم که اگر راهنمایی بفرمایید ممنون میشم.
1- در قسمتهای پیشین اشاره نموده اید که فیلدها در صورت اعلان باید پنهان باشند(یعنی Private) و فقط از طریق property ، کلاسهای دیگر میتوانند به آنها دسترسی داشته باشند. چه لزومی دارد در کلاس JariAccount با وجود پراپرتیهایی که بصورت public و از اینترفیس IAccount انتزاع شده اند فیلدهای مرتبط با آنها بصورت Public اعلان شوند!!؟؟ قانون encapsulation رعایت نشده. ممنون میشم توضیح بفرمایید.
2-در کلاس SepordehAccount دو فیلد
public int YearOfOpenning { get; set; }
public int MonthOfOpenning { get; set; } بصورت پراپرتی و صرفا جهت معرفی دو فیلد مذکور و بدون باز کردن دو عمل set و get نوشته شده اند شما چگونه در متد main و هنگام ساختن آبجکت از نوع ShortTermSepordehAccount حتی با اینکه constructor ی هم از آن کلاس ساخته نشده به دو فیلد YearOfOpenning و MonthOfOpenning مقدار دادید!!؟ مگه میشه به این شکل معرفی، مقداری از خارج بپذیرند؟
3-متاسفانه با اینکه کدها رو عینا مانند شما و خط به خط فیلم آموزشی، کدزنی کردم ولی پراپرتی بررسی محتوای CurrentAmount پیغام لازم را هنگام منفی شدن مقدار فیلد مورد نظر صادر نمیکند و مقدار منفی 200 را درون فیلد قرار میدهد!!!! . بارها بررسی کردم ولی متاسفانه نمیدانم مشکل از کجاست.

پ.ن: در ضمن مثال Shape در فصل نهم حاوی ارور میباشد یعنی اگر شما بجای وارد کردن عدد شکل مورد نظر ناخودآگاه enter کنید با ارور exception handling مواجه شده و از برنامه خارج میشوید. من گمان میکنم که این مورد مربوط به خالی بودن قسمت Default عبارت switch در کلاس InputManager میباشد. حال آنکه علی الظاهر باید درست کار کند. بازم ممنون

آرین زارعی

سلام دوست عزیز. نوروز شما هم مبارک
خیلی خوبه که دقت دارید به تمام مفاهیم. ولی توجه کنید که YearOfOpenning یک property هست و نه فیلد. فیلد مربوط به آن به صورت hidden و ضمنی توسط خود IDE تعریف میشود. یعنی وقتی که از تعریف سریع proprty (به کمک زدن تب) استفاده کنیم، این اتفاق میافتد و فیلد به صورت private و hidden تعریف میشود. در گزینه ی اول هم به نظر میاد همین اشتباه رو کرده باشید.
وقتی هم Set و get رو باز نمیکنیم به این معناست که صرفا هیچ کنترلی را فعلا انجام نمیدهند و به سادگی فقط عمل خواندن و نوشتن در field رو انجام میدن ولی شاید در اینده نیاز به تغییر باشه. در مورد سوال سه نمیشه حدس زد چرا برای شما کار نمیکنه باید دیباگ کنید کدتون رو تا مشکل رو متوجه بشید.
در کل یه نکته رو بگم خدمتتون و اونم اینه که شما باید فکر ارور های مختلف رو کنید و حواستون باشه بهشون . در توضیحی که در پایان دادید این فرض رو کرده بودیم که کسی مقدار خالی وارد نکند ولی در برنامه های بزرگی که مینویسید حتما باید در نظر بگیرید این امکان رو.
موفق باشید

آرین زارعی

سلام.
من در قسمت معرفی پروپرتی و بعدا در جلسات آتی به این نکته اشاره کردم که خود سی شارپ امکان تعریف پروپرتی را به شکل سریع به ما می دهد و این یک استاندارد است که همیشه از پروپرتی ها استفاده کنیم حتی از نوع سریع. که وقتی در آینده قصد اعمال یک شرط بر روی پروپرتی را داشتیم به راحتی با تغییر در قسمت ست یا گت کارمان را انجام دهیم.

پایان زمان پشتیبانی

دانشجوی گرامی، بازه پشتیبانی فعال برای این دوره ۳ ماه است که برای شما به پایان رسیده است.

شما هم چنان می توانید سوالات خود را در این قسمت بپرسید اما اولویت پاسخ گویی با دانشجویانی است که بازه پشتیبانی فعال دارند.

نیاز به لاگین

برای ارسال دیدگاه و یا پرسیدن سوال خود در این قسمت، باید در سایت لاگین شوید.
گزارش مشکل