کلاس UI کلاسی شلوغ و پر از کد است چراکه همهی کارها بهطور عمده در همینجا انجام میشود. البته تا حد ممکن از متد و شیگرایی استفاده خواهد شد اما همانطور که ذکر کردیم حل این تمرین با توجه با مباحثی که تا اینجا مطرح شده انجام میشود و بهتر است بدانید این روشی که با آن، تمرین را انجام میدهیم تا حد زیادی غیر استاندارد است و در دنیای برنامهنویسی حرفهای جایی ندارد. اما دلیلی برای نگرانی نیست چراکه شما باید پله پله مراحل برنامهنویسی حرفهای را طی کنید و مطمئن باشید نمیتوانید یک شبه ره صد ساله را بروید.
در متد ()Main برنامه بهطور کامل بههم مرتبط و قابل اجرا میشود:
class Program } ()static void Main } ;()UI engine = new UI while (true) } ;engine.Proccess(engine.ShowMenu()) ;()Console.ReadLine { { {
برنامه ما به این ترتیب قابل اجرا خواهد بود. هنگامیکه برنامه را اجرا میکنید میتوانید از بین سه گزینهی انتخابی یکی را انتخاب کرده تا کدهای مربوط به هر قسمت اجرا شود اما همانطور که میبینید، متد ()Proccess که عملیات مربوط به هر قسمت را انجام میدهد، خالی و تنها شامل یک دستور switch است.
در مرحلهی بعد، برای اینکه بتوانیم از کلاسهایی که تعریف کرده بهتر استفاده کنیم، برای هر کدام constructor تعریف خواهیم کرد. با کلاس MusicBox شروع میکنیم. همانطور که پیشتر بیان شد، MusicBox شامل آرایهای از خوانندهها است. این کلاس نیز میتواند متدهایی بهمنظور کم و زیاد کردن و نمایش خوانندهها داشته باشد:
class MusicBox } Fields // ;public Artist[] Artists Constructor // public MusicBox(ushort size) } ;Artists = new Artist[size] { Methods // ()public bool AddArtist } ... // { ()public void RemoveArtist } ... // { ()public void ShowArtists } ... // { {
همانطور که میبینید، این کلاس شامل یک فیلد بهنام Artists (که آرایهای از جنس Artist است)، یک constructor و سه متد است. البته در طی تکمیل برنامه فیلدها و متدهایی به برنامه افزوده میشود. در constructor این کلاس، آرایهای از جنس Artist ساخته شده که اندازهی این آرایه، در حین ساختن شیء از MusicBox مشخص میشود.
در قسمت بعد به کلاس Artist یک constructor اضافه میکنیم. هنگامیکه یک شیء از Artist ساخته میشود چه اطاعاتی را باید مقداردهی شوند؟ بهنظر میرسد نام و نامخانوادگی، تعداد آلبوم و تعداد تکآهنگهای منتشر شده از آن خواننده بهتر است که در constructor مشخص شوند:
class Artist } Fields // ;private string ArtistName ;private string ArtistFamily ;private Album[] Albums ;private Tune[] SingleTunes Constructor // public Artist(string artistName, string artistFamily) } ;ArtistName = artistName ;ArtistFamily = artistFamily ;Albums = new Album[5] ;SingleTunes = new Tune[10] { Methods // ()public void AddAlbum } ... // { ()public void RemoveAlbum } ... // { ()public void AddSingleTune } ... // { ()public void RemoveSingleTrack } ... // { {
اگر به constructor این کلاس توجه کنید، میبینید که دو پارامتر artistName و artistFamily وجود دارند که به فیلدهای ArtistName و ArtistFamily اختصاص مییابند. همچنین آرایهای از Album به اندازه ۵ (تعدادی آلبومی که هر خواننده میتواند در این جعبه موسیقی داشته باشد) و آرایهای از Tune به اندازه ۱۰ (تعداد تکآهنگی که هر خواننده میتواند داشته باشد) در این constructor بهوجود آمده است. این مقادیر (اندازه آرایهها) را نیز میتوانستیم مستقیماً از کاربر دریافت کنیم تا اندازه آنها ثابت نباشد اما در اینجا آنها را ثابت در نظر میگیریم.
به نظر شما constructor کلاس Album به چه چیزهایی نیاز دارد؟ هنگامی که یک شیء از کلاس Album در حال ساخته شدن است، چه فیلدهایی باید مقداردهی شوند؟ مسلم است که همهی فیلدهای آن باید مقداردهی شوند. هنگامی که قصد دارید یک Album بسازید باید نام آلبوم، صاحب آن، سبک، سال انشار و آهنگهایی که در آن آلبوم قرار دارند را مشخص کنید. مجدداً به کلاس Album توجه کنید:
class Album } Fields // ;private string AlbumName ;private string AlbumOwner ;private string AlbumGenre ;private ushort AlbumYear ;private Tune[] Tunes Constructor // ,public Album(string albumName, Artist artist string albumGenre, ushort albumYear, Tune[] tunes) } ;AlbumName = albumName ;()AlbumOwner = artist.GetArtistName ;AlbumGenre = albumGenre ;AlbumYear = albumYear ;Tunes = tunes { Methods // ()public void AddTune } ... // { ()public void RemoveTune } ... // { {
هنگامیکه یک شیء از کلاس Album در حال ساخته شدن است، باید نام آلبوم، یک شیء Artist، سبک آلبوم، سال انتشار و یک آرایه از Tune را به آن بدهید تا شیء Album ساخته شود. نکته قابل توجه، شیء Artist و آرایه Tune است. هنگامیکه شما یک شیء از Artist را ساخته و به constructor میدهید میتوانید به تمام اعضای public شیء Artist دسترسی داشته باشید. همانطور که میبینید برای فیلد AlbumOwner ما به نام خواننده (صاحب آلبوم) نیاز داریم. برای این منظور یک متد public به کلاس Artist اضافه میکنیم تا نام خواننده را return کند. (بهدلیل اینکه فیلدهای Artist همهگی private هستند نمیتوانیم مستقیماً به آنها دسترسی داشته باشیم):
()public string GetArtistName } ;return ArtistName {
این متد در کلاس Artist قرار دارد و رشتهی ArtistName را return میکند و بهصورت زیر به رشتهی AlbumOwner اختصاص داده میشود:
AlbumOwner = artist.GetArtistName();
همچنین tunes که آرایهای از کلاس Tune است به constructor داده شده و به فیلد Tunes اختصاص مییابد. دقت کنید که در این لحظه شما آرایهای بهاسم tunes از جنس Tune را در آرایهای دیگر بهاسم Tunes که از جنس Tune است، میریزید. آرایهها باید همجنس هم باشند (هردو از جنس Tune) در غیر اینصورت برنامه شما کامپایل نخواهد شد. برای مثال نمیتوانید آرایهای از جنس Tune را به آرایهای از جنس Artist اختصاص دهید.
نوبت به constructor کلاس Tune میرسد. Tune یا همان آهنگ مورد نظر برای هر خواننده، دو نوع دارد. آهنگ یا در یک آلبوم قرار دارد و یا بهصورت تکآهنگ است. هنگامیکه شما در حال ساخت شیء از Tune هستید، میتوانید آهنگ را طوری بهوجود آورید که مخصوص آلبوم یا بهصورت تکآهنگ باشد. آهنگی که مخصوص آلبوم است، بعضی از اطلاعات آن مثل سال انتشار و صاحب آهنگ از قبل مشخص است اما یک تکآهنگ به سال انتشار و نام صاحب اثر نیز نیاز دارد. برای این منظور در اینجا از constructor overloading استفاده کردهایم:
|