با سوپر بیم به سرعت برق و باد فایل ها را انتقال دهید

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

سوپر بیم یکی از ساده ترین و سریع ترین راههای انتقال فایل ها بین دستگاههای اندرویدی به وسیله وای فای است. دستگاه اندرویدی شما میتواند از طریق اسکن کردن QR کد توسط اسکنر موجود در اپلیکیشن و یا NFC (اگر در دسترس باشد) متصل شده و عملیات انتقال فایل را به راحتی انجام دهد.

از ویژگی های شاخص این اپلیکیشن میتوان به مواردی همچون

اشتراک گذاری فایل های حجیم به وسیله NFC یا اسکن کردن QR کد سرعت انتقال بالای فایل ها از طریق وای فای توانایی سوئیچ کردن به هات اسپات برای دستگاه هایی که وای فای مستقیم را ساپورت نمی کنند امکان استفاده به عنوان شبکه وای فای بین دو دستگاه قابلیت به اشتراک گذاری انواع فایل ها از هر نوعی ( تصاویر، ویدئو، فایل های فشرده، اپلیکیشن و…) اشتراک گذاری با بیش از یک دستگاه تم روشن و تیره اشاره کرد

کار کردن با این اپلیکیشن بسیار ساده بوده و سرعت انتقال فایل بین دستگاه های اندرویدی شما بسیار بالا خواهد بود. کافیست وارد اپلیکیشن شده، فایلی که میخواهید به اشتراک بگذارید را از میان طبقه بندی که اپلیکیشن انجام داده انتخاب کرده سپس دکمه Share را بزنید.یک QR کد برای شما به نمایش در می آید و در دستگاهی که میخواهید فایل را با آن به اشتراک بگذارید از قسمت Recive به وسیله اسکنر تعبیه شده در اپلیکیشن این QRکد را اسکن کرده و فایل به همین راحتی منتقل میشود.

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

پارسیش

۵ شاخصی که یک بازاریاب باید مورد توجه قرار دهد

انیشتن همواره جملات قصار خوبی در رابطه با مسائل مختلف دارد. یکی از معروف‌ترین جملات وی که می‌توان گفت به  بزرگترین چالش دنیای بازاریابی دیجیتال اشاره دارد، این است:

هر چیزی را که باید به حساب آورد را نمی‌توان الزاما حساب کرد، همچنین هر چیزی را که می‌توان حساب کرد را نباید الزاما به حساب آورد.

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

توییت کردن، ارسال پست یا آپلود ویدیو، اینها همه بخش آسان کار هستند. بررسی این که آیا تلاش‌های شما در این راستا تاثیر نهایی از خود به جا می‌گذارد بحثی‌ است که بسیاری از بازاریابان را درگیر خود کرده است.

اما چرا؟ چون اندازه‌گیری معنی‌دار چنین فاکتورهایی فوت‌ و فن خاص خود را دارد. به راحتی می‌توان فهمید که چند دنبال‌کننده در توییتر دارید، یا آخرین پست فیسبوک شما چند لایک خورده است اما هیچکدام از این‌ها واقعا چیزی به شما نمی‌گویند.

واقعیت این است که هر چیزی که را که بتوان به راحتی اندازه‌گیری کرد، دارای کاربرد کمتری برای نمایش ارزش واقعی سازمان دارد. با توجه به گفته‌ی انیشتن، مشکل دیگر اطلاعات زیادی‌ است که یک بازاریاب  را احاطه کرده و ممکن است منجر به تمرکز بر روی مسائل اشتباه شود.

اگر Google Analytics تعداد دفعات مشاهده صفحات وبسایت یا نرخ پرش کاربران را به ما نشان دهد، مطمئنا این‌ها شاخص‌های مهمی هستند. درست نیست؟ جواب این سوال منفی‌ست. فقط به خاطر اینکه این شاخص به صورت نموداری در اختیار شماست به این معنی نیست که ارزش خالص را نشان می‌دهد.

طی سال‌های اخیر علم و رویه‌ی اندازه‌گیری، گام‌های و بزرگ رو به جلو برداشته است. علاوه بر اینکه متخصصان تحلیل بازاریابی دیجیتال وارد عرصه‌ی بازار شده‌اند، ابزارهای زیادی هم وجود دارند که می‌توانند به شما برای نظارت و اندازه‌گیری فعالیت‌تان کمک کنند.

با این حال، بسیاری از کسب‌وکارهای کوچک، غیرانتفاعی و استارتاپ‌ها به حدی از سرمایه نرسیده‌اند که بتوانند چنین تحلیل‌گرانی را استخدام کنند یا از ابزارهای گران‌ قیمت استفاده کنند. اگر شما نیز در این وضعیت هستید، شاید بخواهید بدانید که از کجا باید شروع کرد. در ادامه ۵ شاخص مهم در بازاریابی دیجیتال را برای شما عنوان خواهیم کرد:

۱. دسترسی و میزان درگیری

شاخص‌های رسانه‌های اجتماعی مرتبط با دسترسی و درگیری کاربران (منظور از درگیری این است که هر فرد چه مقدار نسبت به محتوایی که به وی ارائه می‌شود واکنش نشان می‌دهد، به عنوان مثال چند دقیقه از وقت خود را در یک صفحه صرف می‌کند)، اطلاعاتی هستند که به سادگی به دست می‌آیند ولی از لحاظ کارایی تا حدی ضعیف هستند. چرا که همبستگی شاخص‌های دسترسی و درگیری کاربران عملا در بهترین حالت به وضوح مشخص نیست و در بدترین حالت همبستگی وجود ندارد.

با این حال باید به نظارت و بررسی فعالیت رسانه‌ی اجتماعی خود بپردازید، چرا که برای بسیاری از سازمان‌ها فعالیت موثر رسانه‌ی اجتماعی زمینه‌ای را برای تاثیر واقعی کسب‌وکار ایجاد می‌کند. این شاخص را نمی‌توان به عنوان دلیل مستحکمی بر موفقیت بازاریابی به کار برد و بیشتر می‌توان از آن به عنوان یک گام در این مسیر یاد کرد. اما دقیقا به چه چیزی باید توجه کرد؟

هر شبکه‌ی اجتماعی ابزار خاص خود را دارد. (مانند Facebook insights ،YouTube Analytics یا Twitter Analytics) تمامی این ابزارها مطمئنا ۲ معیار را به خوبی نشان خواهند داد و آن میزان دسترسی و درگیری کاربر است.

می‌توان از این دو معیار برای سنجش «سلامتی» صفحه‌ی اجتماعی خود استفاده کنید. آیا دیده می‌شوید؟ آیا مشترکان شما از طریق اینترنت اخبار شما را دنبال می‌کنند؟

یک دوره‌ی زمانی هفته‌ای یا ماهانه مشخص کنید و با توجه به آن بسنجید. به عنوان مثال برای فیسبوک، میزان درگیری و دسترسی برای یک پست طی ۲۸ روز به صورت زیر بایستی محاسبه نمود.

نرخ درگیری = تعداد کاربران درگیر / تعداد کاربرانی که دسترسی داشته‌اند × ۱۰۰

۲. مجموع تراکنش‌ها

Google Analytics ابزار سنجش بسیار قدرتمندی برای سازمان‌های مختلف است. با این حال دو اشتباه رایج که معمولا کاربران گوگل‌ آنالیتیکس مرتکب می‌شوند عبارتند از: یک، بسیاری تنها به ارقام مربوط به میانگین دوره توجه دارند و دو، عدم در نظر داشتن هدف.

بدون هدف شما نمی‌توانید متوجه شوید که آیا کاربران سایت آن کاری که از آنها انتظار می‌رود را انجام می‌دهند یا خیر. خرید یک کالا، اشتراک برای خدمات، دریافت راهنمای یک محصول یا نام‌نویسی برای یک خبرنامه می‌تواند از این دست باشد.

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

۳. نرخ تراکنش‌های بخشی

به عنوان یک بازاریاب، شما باید بدانید کدام فعالیت بیشترین تاثیر را به همراه دارد. اندازه‌گیری نرخ تراکنش‌های بخشی به شما کمک می‌کند که بتوانید بازگشت سرمایه یا ROI خود را محاسبه کنید. (در ادامه بیشتر توضیح خواهیم داد)

برای انجام این کار باید از یک ابزار «ردیاب فعالیت» استفاده کنید تا بتوانید اطلاعات دقیق در رابطه با فعالیت‌های بخش‌های مختلف و نتایج حاصله از هر کدام را در اختیار داشته باشید. چنین ابزاری در گوگل‌آنالیتیکس در نظر گرفته شده و به راحتی می‌توانید به واسطه‌ی آن فعالیت آنلاین کاربران را بررسی کنید، اما به یاد داشته باشید در استفاده از آن اصولی عمل کنید. حتی یک فاصله‌ی اضافی بین کلمات عنوان هر صفحه باعث به وجود آمدن دو خط اضافی در گزارش نهایی خواهد شد.

۴. هزینه‌ی هر خرید/فروش

کسب‌ و کار شما به هر شکلی که باشد، با استفاده از ردیاب‌ فعالیت باید بتوانید به سادگی شاخص هزینه هر خرید/فروش یا CPA را محاسبه کنید. البته ناگفته نماند که از این شاخص می‌توان برای تراکنش‌هایی که الزاما تغییر درآمدی به همراه ندارند نیز استفاده کرد مانند نام‌نویسی برای خبرنامه.

برای شروع می‌توان درآمد میانگین به دست آمده از هر مشتری را محاسبه نمود و با استفاده از آن می‌توانید ببینید که برای جذب هر مشتری به طور میانگین چقدر هزینه می‌کنید.

۵. بازگشت سرمایه

ROI شاخصی‌ است که بیشتر بازاریابان به آن توجه ویژه‌ای دارند. به طور خلاصه ROI به این معنی‌ست که چقدر خرج کرده‌ایم تا این مشتری را جذب کنیم و وی تا بحال چقدر برای ما ایجاد درآمد کرده‌است؟ یا به عبارتی دیگر: ROI = درآمد خالص / هزینه

ROI شاخصی‌ است که معمولا به شکل درصدی بیان می‌شود. هرچه ROI بالاتر باشد بهتر است اما باید شاخص‌های دیگری مانند هزینه‌ی هر فروش یا هزینه‌ی میانگین تبادلات را نیز در نظر داشت.

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

داده‌ها تنها در صورتی حائز اهمیت هستند که بتوانند تعیین کنند که آیا فعالیت‌های شما ارزش خالص ایجاد میکند یا خیر.

پارسیش

تلویزیون پارسیش: برنامه هفت

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

در برنامه این هفته فرصت را غنیمت شمردیم و به مناسبت عید نوروز، برنامه‌ی کوتاه و شادی را برای آخرین روزهای امسالتان ساختیم. در این قسمت نگاهی به رویدادهای مهم بازار فناوری و لحظات شیرین تلویزیون می‌اندازیم. در بخش اول اتفاقات چشمگیر دنیای تکنولوژی در سال گذشته را می‌بینیم و در قسمت دوم گلچینی از پشت صحنه‌های فیلمبرداری برنامه‌های قبلی رو با هم نگاه می‌کنیم. از دیدن این قسمت و تعطیلات پیشِ رو لذت ببرید.

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

پارسیش

نیاز فعلی استارتاپ‌ها چیست

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

برای راحتی کار باید بگوییم استارتاپ‌ها به این سه چیز احتیاج ویژه دارند:

۱. پول

۲. استعداد

۳. مشتری

اما با توجه به رقابت سختی که وجود دارد، بنیان گذاران به سختی می‌توانند این موارد را برای استارتاپ خود فراهم کنند.

در حال حاضر چه منابعی برای استارتاپ‌ها به سختی پیدا می‌شود؟

آقای Ravikant کارآفرینی که  Epinions و Vast.com را پایه گذاری کرد و اخیرا  HitForge و  Venture Hacks را راه اندازی کرده است، می گوید:

در گذشته سرمایه گذاری کردن بزرگ‌ترین نیاز استارتاپ‌ها بود اما امروزه استخدام کردن نیاز اصلی آن‌هاست.

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

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

راویکانت می‌گوید:

در شرایط کنونی سخت است که افرادی را به خدمت بگیریم تا به وسیله‌ی آن‌ّها تیم شرکای تجاری خود را گسترش دهیم. انگار شبیه به آن است که به دوران دات کام بگردیم. مثلا Epinions که کار خود را از سال ۱۹۹۸ آغاز کرد به جای ۲ شریک تجاری ۵ شریک تجاری داشت چراکه مشکل بود در مراحل اولیه‌ی کار افرادی را بدون دادن اعتبار شریک بودن استخدام کرد.

مهم‌ترین نیازهای استارتاپ‌ها استعداد سرمایه گذاری تبلیغات بازاریابی شبکه‌های اجتماعی نشریات شرکای تجاری اعضای هیئت مدیره تیم فروش روابط اجتماعی همخوانی محصول/بازار کلید ماجراست

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

این روال در مورد بودجه و سرمایه گذاری هم صادق است. استارتاپ‌هایی که همخوانی محصول/بازار دارند به راحتی صاحب پول می‌شوند و کسانی که چنین چیزی را ندارند کم کم به پول دست میابند.

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

میلیون‌ها کاربر

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

دوباره نقشه بکشید

بیشتر استارتاپ‌های امروزی نیازی به سرمایه گذاری‌های آن چنانی ندارند. راویکانت می‌گوید:

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

پارسیش

زنگ سی شارپ – قسمت سی و نهم

در قسمت قبل تا حدودی با ارث‌بری آشنا شدید. در این قسمت به‎ادامه‌ی مبحث ارث‌بری می‌پردازیم.

به نحوی‌دسترسی به‌صورت protected در مثال زیر توجه کنید:

using System; class B { protected int i, j; // private to B, but accessible by D public void Set(int a, int b) { i = a; j = b; } public void Show() { Console.WriteLine(i + " " + j); } } class D : B { int k; // private // D can access B’s i and j public void Setk() { k = i * j; } public void Showk() { Console.WriteLine(k); } } class ProtectedDemo { static void Main() { D ob = new D(); ob.Set(2, 3); ob.Show(); ob.Setk(); ob.Showk(); } }

در این مثال، به‌دلیل این‌که کلاس D از B ارث‌بری کرده است و همچنین به‌دلیل این‌که i و j  به‌صورت protected تعریف شده‌اند، متد ()SetK می‌تواند به آن‌ها دسترسی داشته باشد. توجه داشته باشد اگر i و j به‌صورت private تعریف شوند، کلاس D به آن‌ها دسترسی نخواهد داشت.

این‌که چند مرحله ارث‌بری انجام شود، مهم نیست. مانند public و private، دسترسی protected در این مراحل ارث‌بری،  همواره برای یک عضو، protected می‌ماند. از این‌رو، هنگامی‌که یک derived class به‌عنوان یک base class برای یک derived class دیگر مورد استفاده قرار می‌گیرد، تمام اعضای protected در اولین base class  که توسط اولین derived class ارث‌بری شده‌اند، در دومین derived class نیز به‌صورت protected ارث‌بری می‌شوند.

با وجود این‌که دسترسی protected بسیار مفید است، در همه‌ی موقعیت‌ها نباید از آن استفاده کرد و فقط باید زمانی از آن بهره برد که می‌خواهیم یک عضو در سلسه‌مراتب ارث‌بری قابل دسترس، و در خارج از این سلسله‌مراتب، غیر قابل دسترسی باشد.

Constructor ها و ارث‌بری

در سلسله‌مراتب ارث‌بری، هم base class ها و هم derived class ها می‌توانند constructor خودشان را داشته باشند. در این‌جا این سوال به‌وجود می‌آید که کدام constructor مسئول ساختن شیء derived class است؟ آن‌که در base class است یا آن‌که در derived class قرار دارد؟ یا هردو؟ در واقع، constructor ای که در base class قرار دارد، بخش base class یک شیء و constructor ای که در derived class واقع است، قسمت derived class  را  می‌سازد. اگر توجه کنید متوجه می‌شوید که این کار منطقی است زیرا base class هیچ دسترسی و اطلاعی از عناصر درون derived class ندارد و از این‌رو construction آن‌ها باید جداگانه باشد. در مثال‌های قبلی از default constructor که به‌صورت اتوماتیک توسط سی‌شارپ ساخته می‌شوند استفاده شده است اما در عمل بیشتر کلاس‌ها، constructor تعریف می‌کنند.

به مثال زیر توجه کنید:

using System; class A { protected int ID { get; set; } protected int Number { get; set; } } class B : A { protected string Name; public B(int id, int number, string name) { ID = id; Number = number; Name = name; } public void Show() { Console.WriteLine(Name + ": " + ID + " – " + Number); } } class IndehritDemo { static void Main() { B ob1 = new B(180, 1, "Filipe"); ob1.Show(); B ob2 = new B(190, 2, "Cevat"); ob2.Show(); } }

در این‌جا، constructor در کلاس B، متغیرهایی که از کلاس A به ارث برده است را مقداردهی می‌کند.

هنگامی‌که هم در base class و هم در derived class، constructor تعریف شده باشد، روند کار متفاوت‌تر خواهد بود زیرا constructor های base class و derived class هردو بایستی اجرا شوند. در این موارد بایستی از کلمه‌ی کلیدی base، که دو کاربرد دارد، استفاده کنید. کاربرد اول آن برای صدا زدن constructor در base class است. کاربرد دوم آن برای دسترسی به اعضایی از base class است که به دلیل تشابه اسمی در derived class قابل مشاهده نیستند.

فراخوانی constructor های base class

یک derived class می‌تواند constructor ای که در base class اش تعریف شده است را از طریق گسترش دادن فرم constructor در derived class و کلمه‌ی‌کلیدی base، صدا بزند.

فرم کلی تعریف گسترش یافته‌‌ی آن به‌شکل زیر است:

derived-constructor(parameter-list) : base(arg-list) { // body of constructor }

در این‌جا، arg-list مشخص‌کننده‌ی argument های مورد نیاز constructor در base class است. به نحوه‌ی قرار گرفتن colon نیز توجه داشته باشید. به‌منظور این‌که با کاربرد base آشنا شوید به مثال زیر توجه کنید:

using System; class A { private int i, j; public A(int a, int b) { i = a; j = b; } public void ShowA() { Console.Write(i + " " + j); } } class B : A { private int k; public B(int a, int b, int c) : base(a, b) { k = c; } public void ShowB() { ShowA(); Console.WriteLine(" " + k); } } class InheritanceDemo { static void Main() { B b = new B(2, 4, 6); b.ShowB(); } }

به ‌نحوه‌ی تعریف constructor در کلاس B توجه کنید:

public B(int a, int b, int c) : base(a, b) {

در این‌جا، ()B با صدا زدن base همراه با پارامترهای a و b موجب می‌شود تا constructor کلاس A اجرا شده و متغیرهای i و j را مقداردهی کند. B دیگر خودش این متغیرها را مقداردهی نکرده و تنها چیزی که (k) مربوط به خودش است را مقداردهی می‌کند.  Constructor به هر شکلی در base class تعریف شده باشد، می‌تواند توسط کلمه‌ی‌کلیدی base صدا زده شود و آن constructor ای اجرا خواهد شد که با argument ها تطابق داشته باشد.

به مثال زیر دقت کنید:

using System; class A { private int i, j; public A(int a, int b) { i = a; j = b; } public A(int a) { i = j = a; } public void ShowA() { Console.Write(i + " " + j); } } class B : A { private int k; public B(int a, int b, int c) : base(a, b) { k = c; } public B(int a) : base(a) { k = 5; } public void ShowB() { ShowA(); Console.WriteLine(" " + k); } } class InheritanceDemo { static void Main() { B b1 = new B(2, 4, 6); b1.ShowB(); B b2 = new B(1); b2.ShowB(); } }

در این مثال، base class شامل دو constructor بوده که constructor دوم آن شامل یک argument است. بنابراین هنگامی‌که در کلاس B از base استفاده می‌کنید و یک argument به آن می‌دهید، در A آن constructor که یک parameter دارد اجرا خواهد شد.

هنگامی‌که یک derived class از کلمه‌ی‌کیدی base استفاده می‌کند، base مستقیماً به نزدیک‌ترین base class بالای derived class مربوط می‌شود. از این‌رو، هنگامی‌که از سلسله‌مراتب ارث‌بری استفاده می‌کنید، base به نزدیک‌ترین base class در این زنجیره، رجوع خواهد کرد. اگر از base استفاده نکنید، constructor پیش‌فرض base class اجرا خواهد شد.

تا این‌جا با اولین کاربرد base آشنا شدید. کاربرد دوم آن برای دسترسی به اعضایی از base class است که به دلیل تشابه اسمی در derived class قابل مشاهده نیستند. derived class می‌تواند عضوی را تعریف کند که مشابه نام یکی از اعضای base class اش باشد. هنگامی‌که چنین اتفاقی افتد، آن عضو base class در derived class دیده نمی‌شود. درحالی‌که این مورد از لحاظ تکنیکی در سی‌شارپ خطا شمرده نمی‌شود، کامپایلر یک پیغام هشدار به شما داده و از این‌که یکی از اعضا دیده نمی‌شود، شما را باخبر می‌سازد. اگر قصد شما این باشد تا باعث دیده نشدن یکی از اعضای base class شوید، به‌منظور رفع هشدار کامپایلر، در derived class در تعریف آن عضو از کلمه‌ی‌کلیدی new استفاده کنید. دقت داشته باشید که این‌طور استفاده از new با آن حالتی که از آن برای ساختن شیء استفاده می‌کردید، متفاوت است.

به مثال زیر توجه کنید:

using System; class A { public int i = 0; } class B : A { new int i; // this i hides the i in A public B(int b) { i = b; // i in B } public void Show() { Console.WriteLine("i in derived class: " + i); } } class NameHiding { static void Main() { B ob = new B(2); ob.Show(); } }

به نحوه‌ی استفاده‌ی new توجه کنید:

new int i; // this i hides the i in A

این خط کد به کامپایلر می‌گوید که شما می‌دانید متغیر جدیدی به اسم i ساخته شده است و باعث دیده نشدن i در base class خواهد شد. اگر new را از کد بالا حذف کنید، پیغام هشدار compiler را مشاهده خواهید کرد. از آن‌جا که B متغیر i خودش را تعریف می‌کند و باعث دیده نشدن i در A می‌شود، پس از اجرای متد ()Show، مقدار متغیر i که متعلق به B است نمایش داده خواهد شد، نه مقدار i در متغیر A.

استفاده از base برای دسترسی به اعضایی که دیده نمی‌شوند

دومین استفاده از base تا حدودی شیبه به this است با این تفاوت که base همیشه به base class رجوع می‌کند. نحوه‌ی استفاده از base به شکل زیر است:

base.member

در این‌جا، member هم می‌تواند متغیر و هم می‌تواند متد باشد. این نحوه‌ی استفاده از base برای مواقعی است که یک عضو در base class به دلیل تشابه اسمی در derived class دیده نمی‌شود.

به مثال زیر توجه کنید:

using System; class A { public int i = 0; } class B : A { new int i; // this i hides the i in A public B(int a, int b) { base.i = a; // i in A i = b; // i in B } public void Show() { Console.WriteLine("i in base class: " + base.i); Console.WriteLine("i in derived class: " + i); } } class UncoverName { static void Main() { B ob = new B(1, 2); ob.Show(); } }

خروجی:

همان‌طور که می‌بینید، با وجود این‌که متغیر i در B باعث دیده نشدن متغیر i در A می‌شود، با استفاده از کلمه‌ی‌کلیدی base توانستیم در کلاس B به آن دسترسی داشته باشیم.

این مورد درباره‌ی متدها نیز صدق می‌کند. برای مثال اگر در کد قبل، هردو کلاس متدی به اسم ()Show تعریف کنند با استفاده از base می‌توانید در derived class به متد ()Show در base class دسترسی داشته باشید:

using System; class A { public int i = 0; public void Show() { Console.WriteLine("i in base class: " + i); } } class B : A { new int i; // this i hides the i in A public B(int a, int b) { base.i = a; // i in A i = b; // i in B } new public void Show() { base.Show(); // this calls Show() in A // this displays the i in B Console.WriteLine("i in derived class: " + i); } } class UncoverName { static void Main() { B ob = new B(1, 2); ob.Show(); } }

خروجی:

همان‌طور که می‌بینید، ()base.Show باعث شده که متد ()Show در base class صدا زده شود. به نحوه‌ی استفاده از new در این مثال، دقت کنید. new در این‌جا باعث می‌شود به کامپایلر بفهمانید که شما می‌دانید متد ()Show در کلاس B باعث دیده نشدن ()Show در کلاس A می‌شود.

download pdf‌

اگر علاقه مند به دنبال کردن مطالب Webtarget.ir هستید می توانید مشترک فید وب سایت شوید

webtarget.ir

زنگ سی شارپ – قسمت چهل‌ام

آیا سی‌شارپ یک زبان strongly typed است یا weakly typed؟!

احتمالاً این اصطلاحات را بین برنامه‌نویسان زیاد شنیده‌اید اما در واقع این اصطلاحات بی‌معنی هستند و بهتر است که از گفتن آن اجتناب ورزید. ویکی‌پدیا معانی متفاوتی را برای strongly typed لیست کرده که تعدادی از آن‌ها یکدیگر را نقض می‌کنند. هر زمان که دو نفر در مورد strongly typed و weakly typed صحبت می‌کنند احتمالاً معانی متفاوتی از این اصطلاحات در ذهن‌شان نقش بسته است بنابراین هردو برداشت متفاوتی از این اصطلاحات دارند و از طرفی گمان می‌کنند که هردو منظورشان یکسان است. در واقع یک زبان نسبت به یک زبان دیگر، در صورتی‌که در type system) type system مجموعه‌ای از قوانین در زبان برنامه‌نویسی است که در صورت عدم پیروی از آن‌ها با خطا مواجه خواهید شد) محدودیت بیشتری را اعمال کند،  بیشتر strongly typed است و از طرف دیگر، آن زبان که محدودیت کمتری در type system در مقایسه با یک زبان دیگر دارد، نسبت به آن زبان، بیشتر weakly typed است.

بنابراین گفتن این‌که آیا سی‌شارپ (یا هر زبان دیگر) strongly typed یا weakly typed است، صحیح نیست زیرا این موضوع بستگی به زبانی که مقایسه را با آن انجام می‌دهید و همچنین بستگی به دید کسی که در این مورد صحبت می‌کند، دارد و عملاً بهتر است به‌جای استفاده از این اصطلاحات از محدودیت‌ها و ویژگی‌های type system یک زبان صحبت کرد.

ادامه‌ی مبحث ارث‌بری

تا این‌جا ما تنها از یک base class و یک derived class استفاده می‌کردیم اما شما می‌توانید در سلسله‌مراتب ارث‌بری هر تعداد که می‌خواهید base class و derived class داشته باشید. همان‌طور که قبلاً ذکر شد، یک derived class می‌تواند برای یک کلاس دیگر به‌عنوان base class در نظر گرفته شود.

برای مثال اگر سه کلاس A، B و C داشته باشید و C از B ارث‌بری کند و B هم A آن‌گاه کلاس C به همه‌ی عناصر A و B دسترسی دارد.

به مثال زیر توجه کنید:

using System; class A { protected int Width; protected int Height; public A(int w, int h) { Width = w; Height = h; } } class B : A { protected string Style; public B(string s, int w, int h) : base(w, h) { Style = s; } } class C : B { protected string Color; public C(string c, string s, int w, int h) : base(s, w, h) { Color = c; } public void Show() { Console.WriteLine("{0}, {1}: Width: {2} – Height: {3}", Style, Color, Width, Height); } } class MyShape { static void Main() { C ob = new C("Red", "Rectangular", 500, 200); ob.Show(); } }

همان‌طور که می‌بینید، متد ()Show در کلاس C به همه‌ی عناصر کلاس A و B دسترسی دارد و دلیل آن این است که C از B و B از A ارث‌بری کرده است. با این‌که C مستقیماً از A ارث‌بری نکرده اما به‌دلیل وجود این زنجیره‌ی ارث‌بری، کلاس C که در آخر این زنجیره قرار دارد همه‌ی عناصر زنجیره را به ارث می‌برد.

چه زمانی constructor ها فراخوانی می‌شوند؟

شاید در مبحث ارث‌بری و سلسله‌مراتب ارث‌بری، این سوال برای‌تان به‌وجود آمده باشد، هنگامی‌که یک شیء از derived class ساخته می‌شود کدام constructor زودتر اجرا خواهد شد؟ درواقع در سلسله‌مراتب ارث‌بری، constructor ها به ترتیب از ابتدای زنجیره‌ی ارث‌بری  اجرا خواهند شد.

به مثال زیر توجه کنید:

using System; class A { public A() { Console.WriteLine("Constructing A."); } } class B : A { public B() { Console.WriteLine("Constructing B."); } } class C : B { public C() { Console.WriteLine("Constructing C."); } } class InheritanceDemo { static void Main() { C ob = new C(); } }

خروجی:

همان‌طور که در خروجی می‌بینید، constructor ها از ابتدای زنجیره تا انتها، به ترتیب، اجرا شده‌اند. دلیل آن این است که base class هیچ اطلاعی از derived class ندارد و هرگونه مقداردهی و اجرای مورد نیاز در base class جدا از derived class است و از طرفی به‌دلیل این‌که derived class عناصر base class را به ارث می‌برد، نیاز است که base class مقداردهی‌ها و اجراهای‌اش را انجام داده باشد. از این‌رو base class بایستی زودتر اجرا شود.

در سی‌شارپ، reference variable یک کلاس در حالت عادی نمی‌تواند به اشیای کلاس‌های دیگر رجوع کند. برای مثال به برنامه‌ی زیر که دوکلاس در آن تعریف شده است توجه کنید:

using System; class A { int x; public A(int x) { this.x = x; } } class B { int x; public B(int x) { this.x = x; } } class IncompatibleRef { static void Main() { A a = new A(10); A a2; B b = new B(5); a2 = a; // OK, both of same type // a2 = b; // Error, not of same type } }

اگرچه کلاس A و B محتوای یکسانی دارند، اما در سی‌شارپ این اجازه را ندارید که یک reference از نوع B را به متغیری از نوع A اختصاص دهید زیرا این دو، type متفاوتی هستند (type system زبان سی‌شارپ این اجازه را به شما نمی‌دهد). بنابراین اگر در برنامه‌ی بالا، خط کد زیر را از حالت comment خارج کنید با خطای compile-time مواجه خواهید شد:

// a2 = b; // Error, not of same type

در حالت کلی، reference variable یک شیء تنها می‌تواند به اشیایی از جنس خودش رجوع کند اما سی‌شارپ در این مورد یک استثنا دارد و آن این است که reference variable یک base class می‌تواند به تمام اشیایی که از base class مشتق شده‌اند رجوع کند. این استثنا به این دلیل صحیح است که یک نمونه از derived class، نمونه‌ای از base class را در خود دارد و از این‌رو base class می‌تواند به آن رجوع کند.

به مثال زیر توجه کنید:

using System; class A { public int a; public A(int a) { this.a = a; } } class B : A { public int b; public B(int a, int b) : base(a) { this.b = b; } } class BaseRef { static void Main() { A aOb = new A(5); B bOb = new B(3, 6); A aOb2; aOb2 = aOb; // OK, both of same type Console.WriteLine("aOb2.a: " + aOb2.a); aOb2 = bOb; // OK because B is derived from A Console.WriteLine("aOb2.a: " + aOb2.a); // A references know only about A members aOb2.a = 10; // Ok // aOb2.b = 20 // Error! A doesn’t have a b member } }

در این برنامه، B از A ارث‌بری کرده است بنابراین خط کد زیر:

aOb2 = bOb; // OK because B is derived from A

صحیح است زیرا یک base class reference (که در این‌جا aOb2 است) می‌تواند به یک derived class object رجوع کند. هنگامی‌که به base class reference ، یک refenence از شیء derived class اختصاص می‌دهید، در نهایت شما فقط به آن بخش که در base class مشخص شده است دسترسی دارید. به همین دلیل است که aOb2 با اینکه به شیء B رجوع می‌کند، نمی‌تواند به b دسترسی داشته باشد. این امر منطقی است زیرا base class هیچ اطلاعی ندارد که derived class چه عناصر دیگری را افزوده است. به همین دلیل نیز، آخرین خط برنامه comment شده است.

یکی از موقعیت‌هایی که derived class reference به base class variable اختصاص می‌یابد زمانی است که constructor ها در سلسله‌مراتب ارث‌بری صدا زده می‌شوند. همان‌طور که می‌دانید یک کلاس می‌تواند constructor ای داشته باشد که یک شیء از جنس کلاس خودش را به‌عنوان پارامتر بگیرد. کلاس‌هایی که از این کلاس ارث‌بری کرده باشند می‌توانند از ویژگی ذکر شده در مثال قبل استفاده کنند.

به مثال زیر دقت کنید:

using System; class TwoDShape { double pri_width; double pri_height; public TwoDShape() { Width = Height = 0.0; } public TwoDShape(double w, double h) { Width = w; Height = h; } public TwoDShape(double x) { Width = Height = x; } // Construct a copy of a TwoDShape object. public TwoDShape(TwoDShape ob) { Width = ob.Width; Height = ob.Height; } public double Width { get { return pri_width; } set { pri_width = value < 0 ? -value : value; } } public double Height { get { return pri_height; } set { pri_height = value < 0 ? -value : value; } } public void ShowDim() { Console.WriteLine("Width and height are " + Width + " and " + Height); } } // A derived class of TwoDShape for triangles. class Triangle : TwoDShape { string Style; public Triangle() { Style = "null"; } public Triangle(string s, double w, double h) : base(w, h) { Style = s; } public Triangle(double x) : base(x) { Style = "isosceles"; } // Construct a copy of a Triangle object. public Triangle(Triangle ob) : base(ob) { Style = ob.Style; } public double Area() { return Width * Height / 2; } public void ShowStyle() { Console.WriteLine("Triangle is " + Style); } } class Shapes7 { static void Main() { Triangle t1 = new Triangle("right", 8.0, 12.0); // Make a copy of t1. Triangle t2 = new Triangle(t1); Console.WriteLine("Info for t1: "); t1.ShowStyle(); t1.ShowDim(); Console.WriteLine("Area is " + t1.Area()); Console.WriteLine(); Console.WriteLine("Info for t2: "); t2.ShowStyle(); t2.ShowDim(); Console.WriteLine("Area is " + t2.Area()); } }

خروجی:

در این برنامه، t2 از t1 ساخته شده است از این‌رو با آن یکسان است.

به constructor کلاس Triangle دقت کنید:

public Triangle(Triangle ob) : base(ob) { Style = ob.Style; }

این constructor یک شیء از نوع Triangle دریافت می‌کند و از طریق base، این شیء را به constructor کلاس TwoDShape می‌فرستد:

public TwoDShape(TwoDShape ob) { Width = ob.Width; Height = ob.Height; }

نکته این‌جا است که TwoDShape انتظار دارد یک شیء از جنس TwoDShape دریافت کند اما ()Triangle یک شیء از نوع Triangle به آن داده است. همان‌طور که گفته شد، علت این‌که این کد کار می‌کند این است که base class reference می‌تواند به یک شیء derived class رجوع کند. بنابراین هیچ مشکلی ندارد که به ()TwoDShape یک reference بفرستید که این reference به شی‌ءای رجوع می‌کند که از کلاس TwoDShape ارث‌بری کرده است. ()TwoDShape تنها آن بخشی از شیء derived class را می‌سازد که عناصر کلاس TwoDshape هستند و بقیه‌ی قسمت‌های شیء derived class به آن مربوط نیست.

Overriding و متدهای Virtual

Virtual method، متدی است که با کلمه‌ی‌کلیدی virtual در base class تعریف می‌شود. Virtual method به‌شکلی است که می‌توانید آن را در derived class مجدداً تعریف کنید. از این‌رو، هر derived class می‌تواند نسخه‌ی اختصاصی خودش را از virtual method داشته باشد. همان‌طور که گفته شد، virtual method در base class با کلمه‌ی‌کلیدی virtual تعریف می‌شود. هنگامی‌که یک virtual method در derived class مجدداً تعریف می‌شود، باید از override modifier استفاده ‌کنید بنابراین پروسه تعریف مجدد virtual method در derived class را method overriding می‌نامیم. هنگام override کردن یک متد، باید اسم متد، return type و پارامترهای آن را مطابق با virtual method بنویسیم.

به مثال زیر توجه کنید:

using System; class A { public virtual void Hello() { Console.WriteLine("Hello() in A class."); } } class B : A { public override void Hello() { Console.WriteLine("Hello() in B class."); } } class C : A { public override void Hello() { Console.WriteLine("Hello() in C class."); } } class MyClass { static void Main() { A a = new A(); B b = new B(); C c = new C(); a.Hello(); b.Hello(); c.Hello(); } }

خروجی:

ادامه‌ی بحث virtual method و overriding را در قسمت بعد دنبال کنید.

download pdf‌

اگر علاقه مند به دنبال کردن مطالب Webtarget.ir هستید می توانید مشترک فید وب سایت شوید

webtarget.ir

زنگ سی شارپ – قسمت چهل و یکم

در قسمت قبل اندکی با virtual method آشنا شدید. همان‌طور که ذکر شد، پروسه‌ی تعریف مجدد virtual method در derived class را method overriding می‌نامند.

همان‌طور که گفته شد، virtual method در base class با کلمه‌ی‌کلیدی virtual تعریف می‌شود. هنگامی‌که یک virtual method در derived class مجدداً تعریف می‌شود، باید از override modifier استفاده ‌کنید و هنگام override کردن یک متد، باید اسم متد، return type و پارامترهای آن را مطابق با virtual method بنویسید.

به مثال زیر توجه کنید:

using System; class Human { public virtual void SayHello(string name) { Console.WriteLine("SayHello in base class"); } } class Man : Human { public override void SayHello(string name) { Console.WriteLine("Hello " + name); } } class OverrideDemo { static void Main() { Man ob = new Man(); ob.SayHello("Stefan"); } }

متد ()SayHello درکلاس Human به‌صورت virtual تعریف شده است و یک پارامتر دارد. در کلاس Man که از Human ارث‌بری کرده، متد مربوطه override شده است. همان‌طور که می‌بینید این متد در کلاس  Man از override modifier استفاده کرده است. دقت کنید که override کردن یک متد ضروری نیست و در صورتی‌که متدی را override نکنید، آن نسخه از متد که در base class وجود دارد اجرا خواهد شد.

به مثال زیر توجه کنید:

using System; class A { public virtual void SayHello() { Console.WriteLine("SayHello in base class"); } } class B : A { public override void SayHello() { Console.WriteLine("SayHello in B"); } } class C : A { // this class doesn’t override SayHello() } class OverrideDemo { static void Main() { A a = new A(); B b = new B(); C c = new C(); a.SayHello(); b.SayHello(); c.SayHello(); } }

خروجی:

در این‌جا، کلاس C متد ()SayHello را override نمی‌کند بنابراین زمانی‌که متد ()SayHello از طریق شیء c فراخوانی می‌شود، متد ()SayHello در کلاس A اجرا خواهد شد.

هنگامی‌که از سلسله مراتب ارث‌بری استفاده می‌کنید، اگر یک derived class، یک virtual method را override نکند، به طرف ابتدای زنجیره‌ی ارث‌بری حرکت کنید، اولین override آن متد که دیده شود اجرا خواهد شد.

به مثال زیر توجه کنید:

using System; class A { public virtual void SayHello() { Console.WriteLine("SayHello in base class"); } } class B : A { public override void SayHello() { Console.WriteLine("SayHello in B"); } } class C : B { // this class doesn’t override SayHello() } class D : C { // this class doesn’t override SayHello() } class OverrideDemo { static void Main() { D d = new D(); d.SayHello(); } }

خروجی:

همان‌طور که در مثال بالا می‌بینید، کلاس D از C و کلاس C از B و کلاس B از A ارث‌بری کرده است. کلاس D و C متد ()SayHello را override نکرده‌اند اما کلاس B این متد را override کرده است. بنابراین هنگامی که از طریق شیء کلاس D این متد را صدا می‌زنید، در زنجیره‌ی ارث‌بری اولین کلاسی که متد ()SayHello را فراخوانی کرده است کلاس B است. بنابراین همان‌طور که در خروجی می‌بینید، نسخه‌ی override شده‌ی این متد، موجود در کلاس B، اجرا خواهد شد. قابل ذکر است که properties و indexers نیز می‌توانند با استفاده از virtual و override به همین شکل مورد استفاده قرار گیرند.

علت استفاده از متدهای override شده چیست؟

متدهای override شده به سی‌شارپ اجازه می‌دهند تا از ویژگی runtime polymorphism بهره ببرد. Polymorphism توانایی ساخت متدهایی است که با توجه به موقعیت، می‌توانند اجرای متفاوتی داشته باشند. برای مثال شما می‌تواند هم به ماشین و هم به سگ غذا بدهید اما خوب می‌دانید که معنای غذا دادن به این‌دو کاملاً متفاوت است. Polymorphism به این دلیل برای برنامه‌نویسی شی‌گرا اهمیت دارد که به یک کلاس کلی، اجازه می‌دهد متدهایی داشته باشد که در همه‌ی کلاس‌های مشتق شده از آن کلاس، مشترک هستند. این درحالی است که به derived class ها این اجازه را می‌دهد تا هرطور که می‌خواهند آن متدها را اجرا کنند و درصورت نیاز، نحوه‌ی اجرای آن متدها را تغییر دهند. متدهای override شده، روش دیگری برای اجرای این جنبه از polymorphism که می‌گوید “one interface, multiple methods” هستند.

به مثال زیر توجه کنید:

// Use virtual methods and polymorphism. using System; class TwoDShape { double pri_width; double pri_height; // A default constructor. public TwoDShape() { Width = Height = 0.0; name = "null"; } // Parameterized constructor. public TwoDShape(double w, double h, string n) { Width = w; Height = h; name = n; } // Construct object with equal width and height. public TwoDShape(double x, string n) { Width = Height = x; name = n; } // Construct a copy of a TwoDShape object. public TwoDShape(TwoDShape ob) { Width = ob.Width; Height = ob.Height; name = ob.name; } // Properties for Width and Height. public double Width { get { return pri_width; } set { pri_width = value < 0 ? -value : value; } } public double Height { get { return pri_height; } set { pri_height = value < 0 ? -value : value; } } public string name { get; set; } public void ShowDim() { Console.WriteLine("Width and height are " + Width + " and " + Height); } public virtual double Area() { Console.WriteLine("Area() must be overridden"); return 0.0; } } // A derived class of TwoDShape for triangles. class Triangle : TwoDShape { string Style; // A default constructor. public Triangle() { Style = "null"; } // Constructor for Triangle. public Triangle(string s, double w, double h) : base(w, h, "triangle") { Style = s; } // Construct an isosceles triangle. public Triangle(double x) : base(x, "triangle") { Style = "isosceles"; } // Construct a copy of a Triangle object. public Triangle(Triangle ob) : base(ob) { Style = ob.Style; } // Override Area() for Triangle. public override double Area() { return Width * Height / 2; } // Display a triangle’s style. public void ShowStyle() { Console.WriteLine("Triangle is " + Style); } } // A derived class of TwoDShape for rectangles. class Rectangle : TwoDShape { // Constructor for Rectangle. public Rectangle(double w, double h) : base(w, h, "rectangle") { } // Construct a square. public Rectangle(double x) : base(x, "rectangle") { } // Construct a copy of a Rectangle object. public Rectangle(Rectangle ob) : base(ob) { } // Return true if the rectangle is square. public bool IsSquare() { if (Width == Height) return true; return false; } // Override Area() for Rectangle. public override double Area() { return Width * Height; } } class DynShapes { static void Main() { TwoDShape[] shapes = new TwoDShape[5]; shapes[0] = new Triangle("right", 8.0, 12.0); shapes[1] = new Rectangle(10); shapes[2] = new Rectangle(10, 4); shapes[3] = new Triangle(7.0); shapes[4] = new TwoDShape(10, 20, "generic"); for (int i = 0; i < shapes.Length; i++) { Console.WriteLine("object is " + shapes[i].name); Console.WriteLine("Area is " + shapes[i].Area()); Console.WriteLine(); } } }

خروجی:

در برنامه‌ی بالا، ابتدا ()Area به‌صورت virtual در کلاس TwoDShape تعریف شده و سپس توسط کلاس‌های Triangle و Rectangle نیز override شده است. در TwoDShape می‌بینید که ()Area فقط به‌صورت virtual تعریف شده است و تنها کاری که انجام می‌دهد این است که اطلاع می‌دهد این متد باید override شود. هر override از متد ()Area باید بستگی به شکل شیء‌ای داشته باشد که derived class نشان دهنده‌ی آن است. به‌عنوان مثال اگر شکل مورد نظر مستطیل است نحوه‌ی محاسبه‌ی مساحت آن متناسب با مستطیل خواهد بود و اگر شکل مورد نظر مثلث باشد، نحوه‌ی محاسبه‌ی مساحت آن نیز متناسب با مثلث است. نکته‌ی مهم دیگر برنامه‌ی بالا درون متد ()Main است. همان‌طور که می‌بینید shapes آرایه‌ای از اشیای TwoDShape است اما عناصری که در این آرایه قرار دادیم reference های Triangle و Rectangle و TwoDShape هستند. همان‌طور که قبلاً ذکر شد، این مورد به این دلیل صحیح است که base class reference می‌تواند به derived class object رجوع کند. این برنامه سپس توسط یک حلقه، اطلاعات عناصر موجود در آرایه را نمایش می‌دهد.

استفاده از کلاس‌های Abstract

گاهی قصد دارید یک base class بسازید که تنها یک فرم کلی را مشخص می‌کند و آن را با تمام کلاس‌های مشتق شده، به اشتراک می‌گذارد و اجازه می‌دهد که خود derived class ها بدنه‌ و جزئیات این فرم کلی را تکمیل کنند. به‌عنوان مثال، این چنین کلاسی ماهیت یک متد را مشخص می‌کند و derived class ها باید این متد را override کنند اما خود base class دیگر نیازی ندارد که برای این متد یک اجرای پیش‌فرض داشته باشد. این حالت ممکن است زمانی رخ دهد که base class نتواند یک اجرای بامعنی برای متد مورد نظر داشته باشد، از این‌رو اجرا را بر عهده‌ی derived class ها می‌گذارد. مانند مثال قبل که متد ()Area در کلاس TwoDShape، هیچ‌گونه محاسباتی را انجام نمی‌داد. در چنین مواقعی، می‌توانید مانند مثال قبل به‌سادگی یک پیغام هشدار درون متد قرار دهید اما این روش چندان مناسب نیست و ممکن است در شرایط خاصی مثل debug کردن، مناسب باشد. گاهی ممکن است متدهایی در base class داشته باشید که derived class ها حتماً باید آن‌ها را اجرا کنند، در چنین شرایطی باید از abstract method استفاده کنید.

یک متد abstract با abstract modifier ساخته می‌شود. abstract method بدنه ندارد و از این‌رو درون base class اجرا نخواهد شد. derived class ها حتماً باید این abstract method را override کنند. یک abstract method به‌صورت اتوماتیک virtual نیز است و در واقع نمی‌توانید از virtual و abstract باهم در یک تعریف استفاده کنید.

فرم کلی abstract method به‌شکل زیر است:

abstract type name(parameter-list);

همان‌طور که می‌بینید، در abstract method به بدنه نیاز ندارید. دقت کنید که abstract modifier را نمی‌توانید برای متدهای static استفاده کنید. properties و indexers نیز می‌توانند abstract  باشند.

کلاسی که شامل یک یا بیشتر از یک متد abstract باشد باید به‌صورت abstract تعریف شود. برای تعریف یک کلاس به‌صورت abstract کافی است که قبل از کلمه‌ی کلیدی class از abstract modifier استفاده کنید. از آن‌جا که abstract class نمی‌تواند به‌طور کامل اجرا شود (به‌دلیل وجود متدهای abstract که بدنه ندارند)، به‌همین دلیل نمی‌توانید از abstract class شیء بسازید.

هنگامی‌که یک derived class از یک abstract class ارث‌بری می‌کند باید تمام متدهای abstract در base class را override کند در غیر این‌صورت derived class نیز باید به‌صورت abstract تعریف شود.

به مثال زیر توجه کنید:

using System; abstract class TwoDShape { double pri_width; double pri_height; // Parameterized constructor. public TwoDShape(double w, double h, string n) { Width = w; Height = h; name = n; } // Properties for Width and Height. public double Width { get { return pri_width; } set { pri_width = value < 0 ? -value : value; } } public double Height { get { return pri_height; } set { pri_height = value < 0 ? -value : value; } } public string name { get; set; } // Now, Area() is abstract. public abstract double Area(); } // A derived class of TwoDShape for triangles. class Triangle : TwoDShape { string Style; // Constructor for Triangle. public Triangle(string s, double w, double h) : base(w, h, "triangle") { Style = s; } // Override Area() for Triangle. public override double Area() { return Width * Height / 2; } } // A derived class of TwoDShape for rectangles. class Rectangle : TwoDShape { // Constructor for Rectangle. public Rectangle(double w, double h) : base(w, h, "rectangle") { } // Override Area() for Rectangle. public override double Area() { return Width * Height; } } class AbsShape { static void Main() { Triangle triangle = new Triangle("right", 8.0, 12.0); Rectangle rectangle = new Rectangle(10, 4); Console.WriteLine("Triangle | Area: " + triangle.Area()); Console.WriteLine("Rectangle | Area: " + rectangle.Area()); } }

همان‌طور که برنامه نشان می‌دهد، همه‌ی derived class ها بایستی ()Area را override کنند (یا اینکه خودشان باید abstract باشند). نکته‌ی دیگر این است که یک abstract class می‌تواند متدهایی داشته باشد که abstract نیستند و derived class ها می‌توانند در صورت نیاز آن‌ها را override کنند درحالی که هیچ اجباری در کار نیست.

download pdf‌

اگر علاقه مند به دنبال کردن مطالب Webtarget.ir هستید می توانید مشترک فید وب سایت شوید

webtarget.ir

زنگ سی شارپ – قسمت چهل و دوم

استفاده از sealed برای جلوگیری از ارث‌بری

با این‌که inheritance بسیار مفید و کاربردی است، گاهی نیاز است که از انجام شدن آن پیش‌گیری کنید. این‌که در کجا و در چه شرایطی از انجام inheritance جلوگیری کنید، بستگی به مساله و منطق خودتان دارد. در سی‌شارپ با استفاده از کلمه‌ی کلیدی sealed به راحتی می‌توانید مانع انجام شدن inheritance شوید.

 واژه‌ی sealed به معنای مهر و موم شده است و با استفاده از آن اطمینان می‌یابید که از یک کلاس مهر و موم شده نمی‌توان ارث‌بری کرد. به‌منظور sealed کردن یک کلاس، کافی است که در ابتدای تعریف کلاس از کلمه‌ی کلیدی sealed استفاده کنید. دقت داشته باشید که یک کلاس را نمی‌توان هم به‌صورت sealed و هم به‌صورت abstract تعریف کرد چراکه کلاس abstract به تنهایی کامل نیست و برای این‌که اجرای کاملی داشته باشد وابسته به کلاس‌های مشتق‌شده از خودش است.

به مثال زیر دقت کنید:

using System; sealed class A { // … } class B : A { // ERROR! Can’t derive from class A // … } class SealedDemo { static void Main() { B ob = new B(); } }

در مثال بالا، کلاس A به‌صورت sealed تعریف شده است بنابراین هیچ کلاسی نمی‌تواند از این کلاس ارث‌بری کند.

اگر قصد compile کردن برنامه‌ی بالا داشته باشید با این خطا مواجه می‌شوید:

// ‘B': cannot derive from sealed type ‘A’

به این معنا که B نمی‌تواند از کلاس sealed شده‌ی A ارث‌بری کند.

نکته‌ی دیگر این است که sealed می‌تواند در virtual methods نیز برای پیش‌گیری از override شدن مورد استفاده قرار گیرد.

به نمونه‌ی زیر توجه کنید:

class B { public virtual void MyMethod() { /* … */ } } class D : B { sealed public override void MyMethod() { /* … */ } } class X : D { // Error! MyMethod() is sealed! public override void MyMethod() { /* … */ } }

در این‌جا، کلاس B یک متد virtual دارد که در کلاس D هم override و هم sealed شده است. از این‌رو کلاس‌هایی که از D ارث‌بری می‌کنند دیگر نمی‌توانند ()MyMethod را override کنند زیرا این متد دیگر sealed شده است.

The object Class

سی‌شارپ یک کلاس خاص به اسم object دارد که base class تمام type های دیگر است. بدین معنا که تمام type ها (هم reference types و هم value types) از object ارث‌بری کرده‌اند. بنابراین یک reference variable از نوع object می‌تواند به هر نوعی رجوع کند. در قسمت بیست و هفتم زنگ سی‌شارپ با boxing و unboxing آشنا شدید. هنگامی‌که یک متغیر value type به نوع object تبدیل می‌شود، boxing و هنگامی‌که یک نوع object به value type تبدیل می‌شود unboxing اتفاق می‌افتد.

نمونه‌ی زیر نشان می‌دهد که چگونه یک متغیر از نوع object می‌تواند هرگونه data type را بپذیرد:

using System; class ObjectTest { public int i = 10; } class MainClass2 { static void Main() { object a; a = 1; // an example of boxing Console.WriteLine(a); Console.WriteLine(a.GetType()); Console.WriteLine(a.ToString()); a = new ObjectTest(); ObjectTest classRef; classRef = (ObjectTest)a; Console.WriteLine(classRef.i); } } /* Output 1 System.Int32 1 10 */

از لحاظ فنی اسم object در سی‌شارپ، اسم دیگر System.Object بوده که بخشی از Net Framework class library. است. کلاس object تعدادی متد دارد که در جدول زیر می‌بینید:

هنگامی‌که یک کلاس می‌سازید تعدادی از این متدها را مستقیماً در اختیار دارید:

در ادامه مثال‌هایی از ارث‌بری، برای درک بهتر این موضوع می‌بینید.

به مثال زیر توجه کنید:

using System; class Automobile { public string Color { get; set; } public int Weight { get; set; } public int TopSpeed { get; set; } public virtual void Accelerate() { Console.WriteLine("Automobile is accelerating"); } public void Brake() { Console.WriteLine("Automobile is braking"); } } class Car : Automobile { public int TrunkSize { get; set; } } class Truck : Automobile { // … public override void Accelerate() { Console.WriteLine("Truck is accelerating"); } } class Van : Automobile { // … } class MainClass { static void Main() { // … } }

در مثال بالا، کلاس Automobile شامل تعدادی method و property بوده که یکی از این متدها virtual است. کلاس‌های Car و Van و Truck از کلاس Automobile ارث‌بری می‌کنند زیرا همه‌گی به‌نحوی اتومبیل هستند و یک‌سری ویژگی مشترک دارند. هریک از این کلاس‌ها می‌تواند علاوه بر مواردی که به ارث برده است، موارد مورد نیاز خود را نیز اضافه کند. به‌عنوان مثال، همان‌طور که می‌بینید کلاس Car یک property اضافه‌تر دارد و کلاس Truck متد Accelerate را override کرده است تا این متد را متفاوت اجرا کند.

به مثال زیر توجه کنید:

using System; class Vehicle { protected int someInt; public int SomeInt { get { return someInt; } set { someInt = value; } } public void PrintSomeInt() { Console.WriteLine(this.someInt); } public void Transport() { Console.WriteLine("Vehicle is transporting"); } public virtual void Stop() { Console.WriteLine("Vehicle is stopping"); } } class Car : Vehicle { public Car() { this.someInt = 6; } } class Plane : Vehicle { public void IncreaseAlt() { Console.WriteLine("Plane is increasing altitude"); } public override void Stop() { Console.WriteLine("Land"); base.Stop(); } } class Ship : Vehicle { // … } class MainClass { static void Main() { Vehicle a = new Vehicle(); a.Stop(); Plane b = new Plane(); b.Stop(); //… } }

در این مثال، کلاس Vehicle شامل method و متغیر و property است. متغیر someInt به‌صورت protected تعریف شده است، بدین معنا که این متغیر فقط در زنجیره‌ی ارث‌بری قابل مشاهده بوده و خارج از این زنجیره، private است. متد ()Stop به‌صورت virtual تعریف و در کلاس Plane نیز override شده و همان‌طور که می‌بینید متد ()Stop در کلاس Vehicle نیز توسط کلمه‌ی کلیدی base، فراخوانی شده است.

به مثال زیر توجه کنید:

using System; class Shape { public int X { get; set; } public int Y { get; set; } public Shape(int x, int y) { this.X = x; this.Y = y; } } class Circle : Shape { public int Radius { get; set; } public Circle(int x, int y, int radius) : base(x, y) { this.Radius = radius; } } class MainClass { static void Main() { Circle a = new Circle(5, 6, 100); Shape b = new Shape(5, 10); } }

در این مثال، constructor کلاس Shape به دو پارامتر x و y نیاز دارد. کلاس Circle که از Shape ارث‌بری کرده است، باید در constructor خودش این مقادیر را به base class بدهد. همان‌طور که می‌بینید، توسط کلمه‌ی کلیدی base این مقادیر به base class داده شده است.

به مثال زیر توجه کنید:

using System; class Shape { public int X { get; set; } public int Y { get; set; } public int Z { get; set; } public Shape(int x, int y, int z) { this.X = x; this.Y = y; this.Z = z; } public Shape(int def) { this.X = def; this.Y = def; this.Z = def; } } class Oval : Shape { public int BigRadius { get; set; } public int SmallRadius { get; set; } public Oval(int big, int small, int def) : base(def) { this.BigRadius = big; this.SmallRadius = small; } public Oval(int r, int def) : base(def) { this.BigRadius = r; this.SmallRadius = r; } public Oval(int r, int x, int y, int z) : base(x, y, z) { this.BigRadius = r; this.SmallRadius = r; } } class Circle : Oval { public string Color { get; set; } public Circle(string color, int r, int def) : base(r, def) { this.Color = color; } public Circle(int r, int def) : base(r, def) { this.Color = "red"; } public Circle() : base(1, 0, 0, 0) { this.Color = "red"; } } class MainClass { static void Main() { Shape a = new Shape(5); Shape b = new Shape(6, 8, 2); Oval c = new Oval(6, 5); Oval d = new Oval(6, 10); Circle e = new Circle("blue", 5, 9); Circle f = new Circle(5, 7); Console.WriteLine(f.SmallRadius); Console.WriteLine(e.Color); } }

در برنامه‌ی بالا به زنجیره‌ی ارث‌بری و constructor ها دقت کنید. در این مثال کلاس Circle از Oval و Oval از Shape ارث‌بری کرده است. هنگامی‌که شما یک شیء از Circle می‌سازید و دومین constructor آن را صدا می‌زنید:

using System; public Circle(int r, int def) : base(r, def) { this.Color = "red"; }

این constructor باعث فراخوانی constructor ای درکلاس Oval می‌شود که شامل دو پارامتر است:

public Oval(int r, int def) : base(def) { this.BigRadius = r; this.SmallRadius = r; }

و این constructor نیز باعث فراخوانی constructor ای در کلاس Shape می‌شود که شامل یک پارامتر است:

public Shape(int def) { this.X = def; this.Y = def; this.Z = def; }

به این ترتیب است که مقادیر مربوطه مقداردهی می‌شوند.

به مثال زیر توجه کنید:

using System; class Shape { private int x; public int X { get { return x; } set { x = value; } } private int y; public int Y { get { return y; } set { y = value; } } private int width; public int Width { get { return width; } set { width = value; } } private int height; public int Height { get { return height; } set { height = value; } } private string fillColor; public string FillColor { get { return fillColor; } set { fillColor = value; } } private string strokeColor; public string StrokeColor { get { return strokeColor; } set { strokeColor = value; } } private int strokeWidth; public int StrokeWidth { get { return strokeWidth; } set { strokeWidth = value; } } public Shape(int x, int y, int width, int height) { this.x = x; this.y = y; this.width = width; this.height = height; this.fillColor = "white"; this.strokeColor = "black"; this.strokeWidth = 1; } public Shape(int x, int y, int width, int height, string fillColor, string strokeColor, int strokeWidth) { this.x = x; this.y = y; this.width = width; this.height = height; this.fillColor = fillColor; this.strokeColor = strokeColor; this.strokeWidth = strokeWidth; } public virtual double Area { get { return this.width * this.height; } } public virtual double Perimeter() { return 2 * (width + height); } } class Circle : Shape { public Circle(int x, int y, int diameter) : base(x, y, diameter, diameter) { } public Circle() : base(0, 0, 100, 100) { } public double Radius { get { return this.Width / 2.0; } } public override double Area { get { return Math.PI * this.Radius * this.Radius; } } public override double Perimeter() { return 2 * Math.PI * this.Radius; } } class Square : Shape { public Square(int dim) : base(0, 0, dim, dim) { } public Square() : base(0, 0, 100, 100) { } } class Rectangle : Shape { public Rectangle(int x, int y, int width, int height) : base(x, y, width, height) { } public Rectangle() : base(0, 0, 100, 100) { } } class Oval : Shape { public Oval(int x, int y, int width, int height) : base(x, y, width, height) { } public Oval() : base(0, 0, 100, 100) { } } class Line : Shape { public Line(int x, int y, int width, int height) : base(x, y, width, height) { } public Line() : base(0, 0, 100, 100) { } } class MainClass { static void Main() { Rectangle r = new Rectangle(); Console.WriteLine(r.Perimeter()); Square s = new Square(10); Console.WriteLine(s.Area); Circle c = new Circle(); Console.WriteLine(c.Area); Shape a = new Shape(5, 2, 3, 4, "Yellow", "", 9); Console.WriteLine(a.FillColor); Console.WriteLine(a.Perimeter()); Console.WriteLine(a.Area); Line b = new Line(); Console.WriteLine(b.Width); } } /* Output: 400 100 7853.98163397778 Yellow 14 12 100 */

به نحوه‌ی ارث‌بری، override شدن و استفاده از base در constructor ها در برنامه‌ی بالا دقت کنید.

در این قسمت مبحث ارث‌بری به پایان رسید. در قسمت آینده با Interface آشنا خواهید شد.

download pdf‌

اگر علاقه مند به دنبال کردن مطالب Webtarget.ir هستید می توانید مشترک فید وب سایت شوید

webtarget.ir

اطلاعیه در مورد مقالات زنگ سی‌شارپ

بسمه تعالی

با تشکر و قدردانی از همراهان و خوانندگان همیشگی زنگ سی‌شارپ، به اطلاع می‌رساند که ادامه‌ی این سری مقالات آموزشی از ابتدای آذر ماه منتشر و از آن پس تا پایان سال جاری هفته‌ای دو قسمت پخش خواهد شد. امید است که با صبر و شکیبایی شما عزیزان در نهایت یک مجموعه‌ی آموزشی نسبتاً کامل را در اختیارتان قرار دهیم. نظرات و انتقادات شما به بهبود این مجموعه‌ی آموزشی کمک خواهد کرد؛ نظرات و پیشنهادات خود را با ما در میان بگذارید.

پی‌نوشت: تا ابتدای آذرماه می‌توانید سوالات و مشکلات خود را در مورد مطالب ارائه شده در قسمت نظرات بیان کنید. پاسخ مناسب در اولین فرصت برای شما ارسال خواهد شد. لازم به ذکر است که سوال مربوط به هر قسمت را ترجیحاً در قسمت نظرات همان بخش بیان کنید.

 

با تشکر مسعود درویشیان

اگر علاقه مند به دنبال کردن مطالب Webtarget.ir هستید می توانید مشترک فید وب سایت شوید

webtarget.ir

هفت مهارت ضروری برای حضور در مصاحبه شغلی

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

۱- آماده باشید

قبل از اینکه به مصاحبه بروید ، باید آماده باشید. با توجه به اینکه این موضوع بسیار مهم است در عین حال بسیاری افراد از آماده شدن برای مصاحبه شغلی غفلت میکنند “این جمله را بخاطر بسپارید: همیشه یک مکان آماده برای یک فرد آماده , وجود خواهد داشت. ”

اجازه بدهید به شما بگویم چه چیزهایی برای آماده بودن در یک مصاحبه شغلی نیاز است.

نمونه کارهای خود را آماده کنید.

بیش از اندازه به این موضوع اهمیت بدهید. اگر شما در حال آماده سازی خود برای مصاحبه در موقعیت شغلی طراح وب هستید، پس بایستی نمونه کارها آنلاین خود را آماده کنید. اطمینان حاصل نمایید که تمام لینک ها کار میکنند، تمام کدها درست نوشته شده اند و همه ی آیتم ها مرتب چیده شده و سازمان یافته باشد. شما را مجبور به طراحی مجدد کل نمونه کارهایتان نمیکنم ، اما حداقل آن را برای یک ارائه خوب به عنوان یک طراح وب, آماده نمایید. اگر نمونه کار آنلاین ندارید; پس چگونه انتظار دارید به عنوان یک طراح وب کار دریافت نمایید؟ این موضوع بسیار غم انگیز است، اما دیده شده که بسیاری از افراد می خواهند به عنوان یک طراح وب/ طراح گرافیک کار کنند و در عین حال هنوز هم یک نمونه کار ندارند. یادتان باشد این اولویت شماره یک است. نمونه کارها ی خود را آماده و به روز کنید.

در اینجا چندی از چگونگی نمایش نمونه کار های طراحان وب را برای ایده به شما معرفی میکنم:

Gareth Dickey Mike Precious  Brian Hoff Julien Renvoye Paul Currah Olly Gibbs

ظاهر خود را آماده کنید.

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

رزومه خود را آماده کنید.

رزومه کاری را در جهت نمایش سوابق کار خود, مهارت ها و دوره های آموزشی که در راستای آموختن آن کار گذرانده اید بنویسید. روز قبل از مصاحبه ، به رزومه کاری خود که در بعضی مواقع ممکن است آن را زودتر برای کارفرما فرستاده باشید نگاه کنید. حتی میتوانید چند نسخه از آن را در پوشه ایی مرتب قرار داده و در روز مصاحبه به همراه داشته باشید .همچنین، فراموش نکنید یک قلم، چیزی شبیه به یک دفترچه یادداشت که بتوان در صورت نیاز یادداشت و توضیحی را در روز مصاحبه نوشت به همراه خود ببرید .

تحقیق کنید

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

۲- وقت شناس باشید

فرهنگ لغت وقت شناسی را اینگونه تعریف کرده است : ” رسیدن سریع و به موقع در زمان منصوب/ توانایی انجام وظیفه، در زمان تعیین‌شده”

لطفا دیر به مصاحبه نروید. واقعا خوب نیست که به مصاحبه دیر برسید به خصوص قبل از اینکه استخدام شوید. روز قبل مسیر را زمانبندی نمایید و بیشترین زمان را برای رسیدن به مقصد به خودتان بدهید و به اندازه کافی برای وجود ترافیک وقت بگذارید . در بهترین حالت حدود ۱۵-۲۰ دقیقه قبل از مصاحبه در محل حضور پیدا نمایید

۳- مودب باشید

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

همچنین، لطفا در هنگام مصاحبه از ناسزا گویی در مورد هر مسئله ای خودداری نمایید . بعضی افراد ، فقط برای ایجاد حس مشترک از روش صحبت کردن همراه با ناسزا استفاده میکنند , شما هرگز این کار را انجام ندهید.

۴- توجه نمایید

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

۵- هیجان داشته باشید

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

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

۶- استعداهای خود را بشناسید

مصاحبه شغلی زمان مناسبی است تا شرکت مورد نظرتان با شما و همچنین شما با آن آشنا شوید. زمانیست که می توانید به آنها نشان دهید چرا برای این کار آماده اید. معمولا، مصاحبه کننده از شما می پرسد، “چرا ما باید شما را برای این کار استخدام کنیم؟ چه چیز شما را از مابقی متمایز میکند ؟” برای اینگونه پرسش ها آماده باشید و به پاسخ های حرفه ای و واقعی خود بیشتر فکر نمایید .اگر شما واقعا در یک تخصص خوب هستید، مثل HTML5 / CSS3 یا تایپوگرافی، پس بر روی آن متمرکز شوید . اجازه دهید آنها بدانند که شما چگونه می توانید به آن شرکت سود برسانید و کمک حالشان باشید. در این مورد خجالتی نباشید

هر کسی در مصاحبه های کاری ,خودش را به بهترین نحو ممکن نشان میدهد بنابراین شما هم از معرفی خود واقعیتان دریغ نکنید.

به شما پیشنهاد نمیدهم دروغ بگویید و به آنها بگویید که شما بهترین هستید ، فقط با دلایل قانع کننده به آنها دلایلی را که باید شما را برگزینند دهید

۷- پس از مصاحبه

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

در آخر

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

اگر علاقه مند به دنبال کردن مطالب Webtarget.ir هستید می توانید مشترک فید وب سایت شوید

webtarget.ir