معرفی کلمه ی کلیدی virtual و استفاده ی آن در #C

Alternate Text

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

همانطور که مستحضر هستید کلمه‌ی Polymorphism به معنای چندریختی است. در برنامه‌نویسی شیءگرا پلی مورفیسم اغلب به عنوان یک تغییردهنده رفتار یا یک واسط چند متدی مطرح می‌شود.

در زبان برنامه‌نویسی #C پلی مورفیسم به سه شکل ممکن پیاده‌سازی می‌شود:

● استفاده از متدهای virtual و override کردن آنها در کلاس فرزند

● بهره‌گیری از متدهای abstract در کلاس والد

● بهره‌گیری از قابلیت واسط‌ها یا Interfaceها

متدهای virtual

فرض کنید یک کلاس والد به نام Shape دارید که در آن متدی به نام Draw تعریف شده است. متد Draw وظیفه‌ی ترسیم یک شیء یا شکل را به عهده دارد. این متد در تمام کلاس‌هایی که از این کلاس مشتق می‌شوند قابل استفاده است. بنابراین کلاس Shape را به صورت زیر می‌نویسم:


public class Shape
{
    public void Draw()
    {
        Console.WriteLine("Drawing the shape!");
    }
}

حال باید کلاس‌های فرزند مرتبط با این کلاس را تعریف کنیم بنابراین سه کلاس به نام‌های Triangle و Rectangle و Circle را تعریف می‌کنیم که هر سه از کلاس والد یعنی Shape مشتق شده اند:


public class Rectangle : Shape
{
        
}

public class Triangle : Shape
{
        
}

public class Circle : Shape
{
        
}

هر سه کلاسی که در فوق تعریف کردیم می‌توانند از متد Draw استفاده کنند زیرا این متد در کلاس اصلی والد تعریف شده است. حال اگر شیءای بسازیم آنگاه:


var rect = new Rectangle();
var tri = new Triangle();
var circ = new Circle();

rect.Draw();
tri.Draw();
circ.Draw();

Console.ReadKey();

در نهایت خروجی دستورات به صورت زیر است:


Drawing the shape!
Drawing the shape!
Drawing the shape!

اما این خروجی مورد پسند نیست و باید برای هر کلاس یک شکل کشیده شود در نهایت برای رفع این مشکل متد موجود در کلاس والد را به صورت virtual تعریف کرده و آن را درون کلاس فرزند override می‌کنیم. بنابراین تغییراتی در کلاس والد داده و متد Draw را به صورت زیر تعریف می‌کنیم:


public virtual void Draw()
{
    Console.WriteLine("Drawing the shape!");
}

حال همین تغییرات را درون کلاس‌های فرزند انجام می‌دهیم:


public class Rectangle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Drawing rectangle!");
    }
}

حال خروجی دستورات فوق به صورت زیر اصلاح می‌شوند:


Drawing rectangle!
Drawing the shape!
Drawing the shape!

همچنین اگر از کلمه‌ی کلیدی base درون متد کلاس فرزند استفاده کنیم محتوا و متد کلاس پایه نمایش داده خواهد شد:


public override void Draw()
{
    base.Draw();
}

استفاده از روش virtual و override‌ تنها به متدها ختم نمی‌شود بلکه می‌توان برای خصوصیات یا Property ها نیز این کار را انجام داد:


public class Human
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual string FullSpecification
    {
        get { return FirstName + " " + LastName; }
    }
}

public class Employee : Human
{
    public string JobPosition { get; set; }

    public override string FullSpecification
    {
        get { return base.FullSpecification + " with job position: " + JobPosition; }
    }
}

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