کلمات کلیدی Virtual, Override, new و Abstract در #C

دوشنبه 20 مهر 1394

Virtual, Override, new و Abstractکلمات گیج کننده و پرکاربردی هستند .در این مقاله راجع به تمام این کلامات بحث می کنیم .سعی کرده ایم با یک پروژه کاربرد و در نظر گرفتن سناریوهای مختلف برای هر کدام کاربرد این کلمات را در برنامه نویسی شی گرا توضیح دهیم .

کلمات کلیدی Virtual, Override, new و Abstract در #C

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();
}

بعد از اجرا شکل زیر را خواهید دید

آموزش سی شارپ

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 10k بازدید
  • 6 تشکر

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

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید