کلمات کلیدی Virtual, Override, new و Abstract در #C
دوشنبه 20 مهر 1394Virtual, Override, new و Abstractکلمات گیج کننده و پرکاربردی هستند .در این مقاله راجع به تمام این کلامات بحث می کنیم .سعی کرده ایم با یک پروژه کاربرد و در نظر گرفتن سناریوهای مختلف برای هر کدام کاربرد این کلمات را در برنامه نویسی شی گرا توضیح دهیم .
Virtual, Override, new و Abstractکلمات گیج کننده و پرکاربردی هستند .در این مقاله راجع به تمام این کلامات بحث می کنیم .
کلاس زیر را در نظر بگیرید.در این کلاس با کلمه کلیدی Virtual یک تابع(method) به نام SwitchOnAndDisplay تعریف کرده ایم .
class BaseTV { public void SwitchOnAndDisplay() { Console.WriteLine("Basic TV is Switched On And Display Starts"); } }
من پنج سناریو در نظر گرفته ام:
1-یک برنامه نرمال
2-یک برنامه همراه با مفهوم وراثت
3-یک برنامه با مفهوم وراثت و با استفاده از کلمات کلیدی Virtual,override
4-یک برنامه با مفهوم وراثت و کلمه کلیدی new
5-توضیح کلمه کلیدی Abstract
حال هر کدام از سناریو ها را همراه با پروژه توضیح خواهیم داد.
سناریوی 1-یک برنامه نرمال
کلاس ساخته شده قبل به نام BasicTV را در نظر بگیرید.از این کلاس در تابع Main یک شی ایجاد کرده ایم و از آن در تابع SwitchOnTV استفاده کرده ایم .
static void Main(string[] args) { BasicTV tvInst = new BasicTV(); SwitchOnTV(tvInst); Console.Read(); } public static void SwitchOnTV(BasicTV tvInst) { tvInst.SwitchOnAndDisplay(); }
این تابع یک شی از جنس کلاس BasicTV می گیرد تابع SwitchOnAndDisplay از کلاس BasicTV را فراخوانی می کند
سناریوی 2- یک برنامه همراه با مفهوم وراثت
فرض کنید که تکنولوژی پیشرفت کرد و تلویزیون های بهتری قرار است روانه بازار شوند.پس ما یک کلاس AdvancedTV می سازیم که از کلاس BasicTV ارث بری می کند.کد کلاس مانند زیر است.
public class AdvancedTV:BasicTV { public void SwitchOnAndDisplay() { base.SwitchOnAndDisplay(); Console.WriteLine("Switch On Colorfull display"); } public void ChangeColors() { Console.WriteLine("You can change the colors too!!"); } }
در این کد یک تابع همنام با تابع SwitchOnAndDisplay در کلاس پایه است .در بدنه این تابع کد base. SwitchOnAndDisplay همان تابع از کلاس پایه را اجرا می کند و کارهای دیگری هم در این بدنه به متد افزوده ایم.
در تابع main شکل کد برای استفاده از کلاس AdvancedTV مانند زیر است :
BasicTV tvInst = new AdvancedTV(); SwitchOnTV(tvInst); Console.Read();
بعد از اجرای برنامه خروجی زیر را خواهید دید.
فکر می کنید چرا اینطور شد؟چرا با اینکه از کلاس جدید نمونه ساختیم تابع مربوط به کلاس پایه اجرا شد؟به سناریوی بعد دقت کنید
سناریوی 3- یک برنامه با مفهوم وراثت و با استفاده از کلمات کلیدی Virtual,override
برای اینکه تابعی که با نام یکسان در هر دو کلاس پایه و مشتق تعریف کرده ایم بعد از ساخت کلاس از شی مشتق یعنی کلاس AdvancedTV به درستی کار کند و همان تابع درون کلاس AdvancedTV اجرا شود از کلمات کلیدی virtual و override استفاده می کنیم.به کد زیر دقت کنید
public class BasicTV { public virtual void SwitchOnAndDisplay() { Console.WriteLine("Basic TV is Switched On And Display Starts"); } } public class AdvancedTV:BasicTV { public override void SwitchOnAndDisplay() { base.SwitchOnAndDisplay(); Console.WriteLine("Switch On Colorfull display"); } public void ChangeColors() { Console.WriteLine("You can change the colors too!!"); } }
در کلاس پایه متدی که می خواهیم بازنویسی کنیم به شکل Virtual تعریف می کنیم و در کلاس مشتق شده با کلمه override آنرا به شکلی که می خواهیم بازنویسی می کنیم .بعد از اجرای کد شکل زیر را خواهید دید
سناریوی 4- وراثت و متد مخفی ،استفاده از کلمه کلیدی New
در سناریوی دوم همانطور که دیدید از کلمات virtual و overrideاستفاده نکرده ایم و این باعث شد وقتی که کد BaseTV tvInst = new advanced(); و بعد کد SwitchOnTV(tvInst); اجرا شد تابعی که با همان نام تابع SwitchOnAndDisplay از کلاس پایه در کلاس AdvancedTV تعریف کرده بودیم مخفی شود و اصلا کد های بدنه این تابع در کلاس AdvancedTV اجرا نشود و همچنان کدهای تابع هم نام با این تابع در کلاس پایه اجرا شود.
برای اینکه این اتفاق نیافتد باید در کلاس مشتق شده در هنگام تعریف تابع هم نام در کلاس مشتق از کلمه کلیدی new استفاده کنیم مانند کد زیر
public class AdvancedTV:BasicTV { public new void SwitchOnAndDisplay() { base.SwitchOnAndDisplay(); Console.WriteLine("Switch On Colorfull display"); ChangeColors(); } public void ChangeColors() { Console.WriteLine("You can change the colors too!!"); } }
در هنگام ساخت شی هم سازنده و هم اشاره گر به کلاس را از نوع AdvancedTV تعریف می کنیم .advanced tvInst = new advanced(); و نه به صورت BasicTV tvInst = new advanced();
static void Main(string[] args) { AdvancedTV tvInst = new AdvancedTV(); SwitchOnTV(tvInst); Console.Read(); } public static void SwitchOnTV(AdvancedTV tvInst) { tvInst.SwitchOnAndDisplay(); }
سناریوی 5- کلمه کلیدی Abstract
در این سناریو یک کلاس BasicTV داریم که متد SwitchOnAndDisplay به صورت Abstract تعریف شده است .چون این کلاس یک متد Abstract تغریف شده است باید کلاس را هم به صورت Abstract تعریف کنیم
مانند کد زیر
public abstract class BasicTV { public abstract void SwitchOnAndDisplay(); public void SwitchOnTheTV() { Console.WriteLine("TV is Switched On"); } }
دو کلاس دیگر به نام های AdvancedTV و ledTV هم تعریف می کنیم این دو کلاس از کلاس BasicTV ارث بری می کنند .در هر دو این کلاس ها متد SwitchOnAndDisplay را override کرده ایم .یعنی هر کدام از این دو کلاس هر طور که دوست داشته اند متد SwitchOnAndDisplay را پیاده سازی کرده اند.
public class AdvancedTV:BasicTV { public override void SwitchOnAndDisplay() { base.SwitchOnTheTV(); Console.WriteLine("Switch On Colorfull display"); ChangeColors(); } public void ChangeColors() { Console.WriteLine("You can change the colors too!!"); } } public class LEDTV : BasicTV { public override void SwitchOnAndDisplay() { base.SwitchOnTheTV(); Console.WriteLine("Switch On Colorfull display with 16k Colors"); ChangeColors(); } public void ChangeColors() { Console.WriteLine("You can choose among the 16K colors!!"); } }
تابع main دارای کد زیر است
static void Main(string[] args) { BasicTV TvInst = new AdvancedTV(); SwitchOnTV(TvInst); BasicTV advTvInst = new LEDTV(); SwitchOnTV(advTvInst); Console.Read(); } public static void SwitchOnTV(BasicTV tvInst) { tvInst.SwitchOnAndDisplay(); }
بعد از اجرا شکل زیر را خواهید دید
- C#.net
- 10k بازدید
- 6 تشکر