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

- visibility ۸ mode_comment

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

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

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

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

info توجه

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

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

comment دیدگاه کاربران
yasermeha

سلام عرض شد
دوتا سوال دارم ، اول اینکه کی از این محیط کنسول میاید بیرون ؟
دوم اینکه پروژه تا حدی پیش میره که ما بتونیم (یا خودتون) اونو تحت وب هم کار کنیم؟

آرین زارعی

سلام.
در فصل بعدی که کارمون با پایگاه داده هست و اصلا به این محیط کاری نداریم و فصل 4 هم حدود 3-4 جلسه با محیط کنسول کار می کنیم. بعد از اون دیگه وارد محیط گرافیکی میشیم. علت اینکار هم این هست که شما با مفاهیم برنامه نویسی سی شارپ کاملا آشنا بشید در یک محیط خیلی ساده و سپس درگیر مسائل گرافیکی بشید.
بله ببینید تحت وب یا دسکتاپ بودن پروژه تفاوتش تقریبا در لایه ی پرزنتیشن پروژه هست. یعنی شما پایگاه داده تون یکسان هست، لایه های ارتباطی ما بین هم یکسان خواهد بود و فقط برنامه ای که کاربر نهایی با اون کار می کنه متفاوت می شه که می تونه یک برنامه دسکتاپ باشه یا یک وب سایت یا حتی یک نرم افزار موبایل و …
شما اگر معماری وب رو بدونید، می تونید این پروژه رو ببرید بر روی وب، و با asp اون رو بنویسید.

حجت قربانی

سلام آقای زارعی
من یک سوال فنی برام پیش آمده بود که حتی با سرچ توی اینترنت هم نتونستم اون رو بفهمم دیگه به عنوان آخرین راه از شما بپرسم:
سوالم اینکه ما دونوع پراپرتی داریم
public int YearOfOpenning { get; set; }
که نوع بالا نوع ساده ی پراپرتی هست . میدونیم که نوع دیگری از پراپرتی وجود داره که برای مقداردهی و عوض کردن و بدست آوردن مقدار متغیر های درون یک شی استفاده میشه و تقریبا مثل تابع تعریف میشه
ولی شما اینجا از خود پراپرتی به عنوان متغیر استفاده کردین. مثل این میمونه که ما از تابع به عنوان یک متغیر استفاده کنیم
وحتی در کد زیر پیاده سازی ای برای پراپرتی نداریم یعنی get و set رو تعریف نکردیم ولی جوری از اونها اسفاده کردید که انگار get و set دارن. یعنی به پراپرتی به عنوان متغیر نگاه کردین و از مزیت های پراپرتی توی تغییر و خوندن مقدار استفاده کردین بدون اینکه پیاده سازی داشته باشیم. این دو نکته رو اصلا اشاره نکردین

int OpenningTotalMonth = base.YearOfOpenning*12 + base.MonthOfOpenning;

آرین زارعی

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

پژمان

سلام جناب زارعی . ضمن تبریک پیشاپیش عید نوروز 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 رو انجام میدن ولی شاید در اینده نیاز به تغییر باشه. در مورد سوال سه نمیشه حدس زد چرا برای شما کار نمیکنه باید دیباگ کنید کدتون رو تا مشکل رو متوجه بشید.
در کل یه نکته رو بگم خدمتتون و اونم اینه که شما باید فکر ارور های مختلف رو کنید و حواستون باشه بهشون . در توضیحی که در پایان دادید این فرض رو کرده بودیم که کسی مقدار خالی وارد نکند ولی در برنامه های بزرگی که مینویسید حتما باید در نظر بگیرید این امکان رو.
موفق باشید

پژمان

سلام دوباره. جناب زارعی در مثال 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 معرفی کنیم. درست میگم؟ اگر اینطور باشه در نگاه اول به نظر درست میاد. این خیلی خوب هست که راه حل های متفاوت و صحیح به ذهنتون میرسه. سعی کنید حتما پیاده سازی کنید اون ها رو چرا که خیلی از مشکل ها اگر وجود داشته باشند در مرحله ی تست کردن ظاهر میشن و به صورت تئوری سخت میشه پیداشون کرد. ولیکن همیشه سعی کنید تا حد ممکن ساده ترین راه حل ممکن رو انتخاب کنید از هر نظر
موفق باشید

نیاز به لاگین

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