تبلیغات
banner
banner
banner
تبلیغات
banner

فیلم های آموزشی : 36 +

تعداد کاربران : 44 +

تعداد کل مطالب : 338 +

تعداد نظرات : 33 +

حضرت محمد (ص) : داناترین مردم کسى است که دانش دیگران را به دانش خود بیفزاید.

آموزش مقدماتی تا پیشرفته سی شارپ بخش صد و بیست و یکم


به نام پروردگار جهان

آموزش مقدماتی تا پیشرفته سی شارپ بخش صد و بیست و یکم

سلام به همه کاربران وبسایت لندلرن

قسمت صد و بیست و یکم


چگونه كار مي كند؟

به وسيله override كردن يك متد، مي توانيد پياده سازي متدهاي موجود در كلاس پايه را در كـلاس مـشتق شـده تغييـر دهيد.

البته اين كار براي تمام متدهاي كلاس پايه ممكن نيست، بلكه متد مورد نظر بايد با كلمـه كليـدي virtual مـشخص شود تا بتوانيد آن را در كلاس مشتق شده override كنيد .

مجدداً به مفهوم كپسولي بودن برمي گرديم .

بعد از override كردن متد، فردي كه از آن استفاده مي كند اصلاً تفـاوتي را در اجراي متد متوجه نمي شود – او فقط به همان صورتي كه از اين متد قبل از override شدن استفاده مي كرد هم اكنون هـم استفاده مي كند .

اما اين مرتبه به علت اينكه در واقع در حال كار با يك شيئ از كلاس SportsCar است نتيجـه متفـاوتي را دريافت مي كند .

override كردن يك متد از بسياري از جهات با override كردن يك متد سازنده تفاوت دارد .

هنگامي كه يـك متـد سازنده را override مي كنيد، قبل از اينكه متد سازنده ي جديد فراخواني شود متد سازنده قبلي فراخواني خواهد شد.

امـا اگـر يـــك متـــد عـــادي را override كنيـــد، متـــد قبلـــي فقـــط در صـــورتي فراخـــواني خواهـــد شـــد كـــه از دســـتور MethodName.base استفاده كنيد .

كلمه كليدي base در كلاس مشتق شده براي دسترسي به اعضاي كـلاس پايـه به كار مي رود.

فرض كنيد متد CalculateAccelerationRate در كلاس Car يك مقدار ثابت را برنمي گرداند، بلكه بعـد از انجام دادن يك سري محاسبات، مقداري را برمي گرداند و شما مي خواهيد اين متد در كلاس SportsCar ،علاوه بر انجام دادن آن محاسبات، مقدار نهايي را در مقدار تابع GetPowerToWeightRatio نيز ضرب كند .

بنابراين مي توانيـد از دستور زير در متد override شده در كلاس SportsCar استفاده كنيد :

به اين ترتيب ابتدا تابع CalculateAccelerationRate از كـلاس پايـه فراخـواني مـي شـود .

سـپس مقـدار برگشتي اين تابع در مقدار بر گشتي تابع GetPowerToWeightRatio ضرب شده و نتيجه به عنـوان مقـدار جديـد تابع CalculateAccelerationRate برمي گردد .

به ارث بردن از كلاس Object:

آخرين مطلبي كه در مورد وراثت بايد بررسي كنيم اين است كه در NET .حتي اگ ر كلاسي را به صورت عادي و بدون تعيين كردن كلاس پايه براي آن تعريف كنيد، آن كلاس از كلاسي به نام Object مشتق مي شود .

كلاس Object شامل چهـار متـد است كه مي توانيد تضمين كنيد در تمام كلاسهاي نوشته شده به وسيله NET .وجود دارند. البته شرح وظيفه ايـن متـدها خـارج از
مباحث اين دوره است، با وجود اين دو تابع پر استفاده از آنها را در اين قسمت معرفي مي كنيم :

ToString :اين متد رشته اي كه حاوي متني براي معرفي كردن شيئ است را برمي گرداند .

به خاطر داريد كـه در ابتداي دوره گفتم هر شيئ بايد بداند كه از چه نوعي است .

در حقيقت با استفاده از اين متد، يك شيئ نوع خود را به شـما اعلام مي كند .

البته اين در صورتي است كه اين متد override نشده باشد .

هنگام طراحي كلاس، مي توانيد ايـن متد را override كنيد تا يك رشته ي با معنـي بـراي مـشخص كـردن شـيئ برگردانـد، بـراي مثـال در كـلاس
Customer اين متد را به صو رتي override كنيد كه نام مشترك را برگرداند .

اگر در يك كلاس اين تابع را override نكنيد، به صورت پيش فرض نام كلاس توسط اين تابع برگشت داده مي شود.

GetType :اين متد شيئ را از كلاس Type برمي گرداند كه مشخص كننده نوع داده اي كلاس است.

به خاطر داشته باشيد كه لازم نيست يك كلاس را با استفاده از عملگر : از كلاس Object مـشتق كنيـد، زيـرا ايـن كـار بـه صورت اتوماتيك انجام مي شود.


اشيا و ساختارها :

با نحوه كار با ساختارها در قسمتهای قبلی آشنا شديد .

ساختارها نيز همانند كلاسها راهي را فراهم مي كنند كه بتوانيـد چنـدين قطعـه از اطلاعات مرتبط به هم را در يك گروه قرار دهيد .

يك ساختار هم مي تواند همانند يك كلاس، علاوه بر فيلد شامل خاصـيت و متـد نيز باشد.

در اين قسمت با بعضي از تفاوتهاي كلاسها و ساختارها آشنا مي شويم .

در اصطلاح كامپيوتري، ساختارها به عنوان نوع هاي مقداري و كلاسها به عنوا ن نوع هاي ارجاعي شناخته مـي شـوند .

هـر متد هنگامي كه فراخواني مي شود، قسمتي از حافظه را اشغال مي كند و متغيير هايي كه در طول كار خود به آنها نياز دارد را در ايـن قسمت ايجاد مي كند و معمولاً بعد از اجراي تابع، اين قسمت از حافظه نيز آزاد مي شود .

همچنين پارامتره ايي كه به آن فرستاده مي شوند نيز در حقيقت در اين قسمت از حافظه كپي مي شوند تا متد بتواند از آنها استفاده كند .

ساختارها معمولاً اندازه هاي كوچكي دارند، براي مثال شامل چندين متغير از نوع عدد صحيح و يا چند رشته هستند كه مقدار كمي از فضاي حافظه را اشغال مي كنن . د بنابراين كامپيوتر مي تواند به راحتي آنها را به فضاي مخصوص يك تابع انتقال دهد تا تابع بتواند از آن استفاده كند .

اما كلاسها بسيار بزرگتر از ساختارها هستند. يك كلاس معمولاً شامل چندين عضو از كلاسهاي ديگـر اسـت .

بـراي مثال كلاسي به نام Control در چارچوب NET .و جود دارد كه تمام كنترلهاي مورد استفاده از آن مـشتق مـي شـوند .

ايـن كلاس شامل ۲۰۵ فيلد (كه بسياري از آنها شامل شيئ اي از يك كلاس ديگر هـستند ) ۷،متـد سـازنده، ۱۶۳ خاصـيت و ۵۲۴ متـد است.

مسلم است كه فضايي كه چنين كلاسي از حافظه اشغال مي كند بسيار بيشتر از يك سـاختار اسـت و كـامپيوتر نمـي توانـد درصورت لزوم آن را به راحتي به فضاي مخصوص به يك تابع انتقال دهد .

براي حل اين مشكل از آدرس كلاسها در حافظـه اسـتفاده مي كنند .

به اين معني كه هنگامي كه يك شيئ براي مرتبه اول در قسمتي از حافظه ايجاد مي شود، اگر بخواهيم آن را به يك تـابع به عنوان پارامتر انتقال دهيم كل شيئ را مجدداً در فضاي مخصوص تابع كپي نمي كنيم، بلكه آدرس كنوني شـيئ را در حافظـه بـه تابع مي فرستيم.

به اين ترتيب تابع در صورت نياز مي تواند با استفاده از آدرس شيئ، به آن دسترسي داشته باشد .

بنابراين به علت اينكه در صورت نياز به انتقال ساختارها مقدار آنها منتقل مي شود، به آنها نوع هاي مقداري و براي اينكه در صـورت نياز به انتقال كلاسها فقط آدرس قرارگيري آنها در حافظه منتقل مي شود، به كلاسها نوع هاي ارجاعي مي گويند .

در قسمتهاي قبلي گفتم كه يك شيئ از كلاس مي تواند داراي چندين نام باشد به عبارت ديگر از چندين قلاب آويزان شود.

دليـل اين مورد اين است كه يك متغير كه براي يك شيئ از كلاس تعريف مي كنيم در واقع محتوي خود شيئ نيست، بلكه محتوي آدرس قرارگيري آن شيئ در حافظه است .

بنابراين مي توانيم چندين متغير با نامهاي متفاوت تعريـف كنـيم و آدرس شـيئ را در آنهـا قـرار دهيم.

به اين ترتيب براي دسترسي به شيئ از هر كدام از اين متغيير ها مي توانيد استفاده كنيد.

همچنين اگر با استفاده از يكي از اين متغيير ها شيئ را تغيير دهيد، شيئ موردنظر براي تمام متغيير هاي ديگر نيز تغيير مي كند .

بنابراين هنگام تصميم گيري بين ساختار و كلاس همواره در نظر داشته باشيد كه اگر اطلاعاتي كه مي خواهيـد در يـك گـروه قـرار دهيد كوچك بودند بهتر است كه از ساختارها استفاده كنيد .

در غير اين صورت استفاده از كلاسها بهتر از اسـتفاده از سـاختارها اسـت .

البته كلاسي كه در بالا مثال زديم نيز كلاس بسيار بزرگي است و حتماً نبايد حجم اطلاعات به اين اندازه باشد تا از كـلاس اسـتفاده كنيد .

همچنين يكي ديگر از تفاوتهاي ساختارها با كلاسها در اين است كه ساختارها داراي مبحث وراثت نيستند .

این بخش هم به پایان رسید.

به ادامه آموزش سی شارپ به زبان فارسی (قسمت بعدی) مراجعه کنید.


درباره نویسنده
سجاد اسدی
   سجاد اسدی

سجاد اسدی هستم دانشجوی رشته نرم افزار و علاقه مند به تدریس و یادگیری دروس مرتبط با تکنولوژی نرم افزار و اینترنت اشیاء جهت ارتباط با بنده مراجعه شود به آیدی سروش و تلگرام : @ordervira و پیج بنده در اینستاگرام instagram.com/sajjadred11 ""اللهم صل علی محمد و آل محمد"" برای شروع هیچ وقت دیر نیست. "الهم عجل لولیک الفرج"

دیدگاه بگذارید

avatar
  اشتراک  
اطلاع رسانی

aparat کانال آپارات

soroush کانال سروش

کانال آی گپ