آموزش سی شارپ – معرفی overriding
در این دوره شما یاد گرفتید که با زبان برنامه نویسی سی شارپ چگونه باید برنامه نوشت ولی دربارهی موضوع برنامه نویسی هیچگاه صحبتی نشد. چرا که برنامه نویسی اصولی دارد که هر فرد با یادگیری آنها باید ایدههای درونی خودش رو به کد درآورده و اجرا کند؛ پس در هیچ دورهای به شما شخصی نخواهد گفت با این آموزش این رو بنویسید. (به غیر از آموزشهای پروژه محور)
حتما قبل از بررسی معرفی overriding نوشتهی مطالب قبلی این دورهی آموزشی را با هشتگ #دوره آموزشی_سی_شارپ در سایت ما را مطالعه کنید.
آموزش سی شارپ – معرفی overriding
Overriding و متدهای Virtual:
Virtual method، متدی است که با کلمهی کلیدی virtual در base class تعریف میشود. Virtual method به شکلی است که میتوانید آن را در derived class مجددا تعریف کنید. از این رو، هر derived class میتواند نسخهی اختصاصی خودش را از virtual method داشته باشد. هنگامی که یک virtual method در derived class مجددا تعریف میشود، باید از override modifier استفاده کنید. بنابراین پروسه تعریف مجدد virtual method در derived class را method overriding مینامیم. هنگام override کردن یک متد، باید اسم متد، return type و پارامترهای آن را مطابق با virtual method بنویسیم. به مثال زیر توجه کنید:
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.");
}
}
// Using :
A a = new A();
B b = new B();
C c = new C();
a.Hello();
b.Hello();
c.Hello();
مثال:
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);
}
}
// Using :
Man ob = new Man();
ob.SayHello("Stefan");
هنگامی که از سلسله مراتب ارث بری استفاده میکنید، اگر یک derived class، یک virtual method را override نکند. به طرف ابتدای زنجیرهی ارثبری حرکت کنید، اولین override آن متد که دیده شود اجرا خواهد شد. به مثال زیر توجه کنید:
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
{
}
class D : C
{
}
// Using :
D d = new D();
d.SayHello();
علت استفاده از متدهای override شده
متدهای override شده به سیشارپ اجازه میدهند تا از ویژگی runtime polymorphism بهره ببرد. Polymorphism توانایی ساخت متدهایی است که با توجه به موقعیت، میتوانند اجرای متفاوتی داشته باشند. Polymorphism. به این دلیل برای برنامهنویسی شیگرا اهمیت دارد که به یک کلاس کلی، اجازه میدهد متدهایی داشته باشد که در همهی کلاسهای مشتق شده از آن کلاس، مشترک هستند. این در حالی است که به derived classها این اجازه را میدهد تا هرطور که میخواهند آن متدها را اجرا کنند. درصورت نیاز، نحوهی اجرای آن متدها را تغییر دهند. متدهای override شده، روش دیگری برای اجرای این جنبه از polymorphism که میگوید one interface” multiple methods” هستند.
استفاده از کلاسهای Abstract
اگر یک base class بسازیم که فقط یک فرم کلی را مشخص کرده و آن را با تمام کلاسهای مشتق شده، به اشتراک بگذارد و اجازه دهد که derived classها بدنه و جزئیات این فرم کلی را تکمیل کنند. این حالت زمانی رخ میدهد که base class نتواند یک اجرای بامعنی برای متد مورد نظر داشته باشد، از این رو اجرا را بر عهدهی derived classها میگذارد. یا ممکن است متدهایی در base class داشته باشید که derived classها حتما باید آنها را اجرا کنند. در چنین شرایطی باید از abstract method استفاده کنید.
فرم کلی abstract method بهشکل زیر است:
abstract type name(parameter-list);
یک متد abstract با abstract modifier ساخته میشود. abstract method بدنه ندارد و از اینرو درون base class اجرا نخواهد شد. derived classها حتما باید این abstract method را override کنند. یک abstract method به صورت اتوماتیک virtual نیز است و در واقع نمیتوانید از virtual و abstract باهم در یک تعریف استفاده کنید. همهی derived classها بایستی متد abstract در base class را override کنند (یا اینکه خودشان باید abstract باشند).
نکته: یک abstract class میتواند متدهایی داشته باشد که abstract نیستند.
derived classها میتوانند در صورت نیاز آنها را override کنند درحالی که هیچ اجباری در کار نیست.
مثال:
abstract class TwoDShape
{
double pri_width;
double pri_height;
public TwoDShape(double w, double h, string n)
{
Width = w;
Height = h;
name = n;
}
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 abstract double Area();
}
class Triangle : TwoDShape
{
string Style;
public Triangle(string s, double w, double h) : base(w, h, "triangle")
{
Style = s;
}
public override double Area()
{
return Width * Height / 2;
}
}
class Rectangle : TwoDShape
{
public Rectangle(double w, double h) : base(w, h, "rectangle") { }
public override double Area()
{
return Width * Height;
}
}
نظرات خود را در ارتباط با “مفهوم overriding در سی شارپ” بنویسید تا در دورههای بعدی از آنها استفاده کنیم.
خب این جلسه هم به پایان رسید باید به این نکته توجه کنید که مباحث بالا در برنامه نویسی تجاری اهمیت فراوانی دارد.
برای استفاده از تمامی جلسات از هشتگ #دوره آموزشی_سی_شارپ در سایت ما استفاده کنید.
منتظر جلسهی بعدی دوره آموزشی سی شارپ باشید.



















ممنون که تفاوتها رو هم گفتید
موفق باشید.
وقتی متدی virtual تعریف میشه، آیا حتماً باید override بشه؟
خیر، وقتی یک متد virtual تعریف میشود، لزوماً لازم نیست که در کلاسهای مشتق override شود. متد virtual یعنی یک پیادهسازی پایه وجود دارد که میتواند توسط کلاسهای فرزند تغییر داده شود، اما اگر کلاس مشتق نخواهد رفتار پیشفرض را تغییر دهد، میتواند اصلاً متد را override نکند و همان نسخهی پایه اجرا خواهد شد. به عبارتی، override کردن متد virtual اختیاری است و فقط زمانی انجام میشود که بخواهید رفتار متد را سفارشی کنید.
چرا نمیشه یه متد هم virtual باشه هم abstract؟
متد نمیتواند هم virtual باشد هم abstract چون هر دو مفهوم در تضاد هستند: متد abstract یعنی فقط امضای متد تعریف شده و هیچ پیادهسازیای ندارد، پس باید حتماً در کلاسهای مشتق پیادهسازی شود؛ اما متد virtual یعنی متد دارای یک پیادهسازی پایه است که میتواند در کلاسهای فرزند بازتعریف (override) شود یا نشود. به عبارتی، متد abstract ذاتاً بدون پیادهسازی است و نیازی به virtual بودن ندارد چون حتماً باید در زیرکلاسها نوشته شود، اما متد virtual یعنی پیادهسازی پایه دارد که اختیاری است بازنویسی شود. بنابراین، ترکیب همزمان این دو غیرممکن است و کامپایلر اجازه نمیدهد.
abstract methodها خیلی شبیه interface هستن، فرق اصلیشون چیه؟
فرق اصلی بین abstract method و interface در سیشارپ این است که abstract method بخشی از یک کلاس انتزاعی (abstract class) است و این کلاس میتواند شامل پیادهسازیهای معمولی (کد آماده) و همچنین فیلدها و سازندهها باشد، در حالی که interface فقط قرارداد یا امضاهای متدها و پراپرتیها را تعریف میکند و هیچ پیادهسازیای ندارد (تا قبل از نسخههای جدید که default implementation اضافه شده). به عبارت دیگر، کلاسهای abstract میتوانند هم متدهای abstract و هم متدهای معمولی داشته باشند و به عنوان یک پایهی نیمهکامل عمل کنند، اما interfaceها صرفاً نوعی قرارداد خالص برای پیادهسازی هستند و کلاسهایی که آنها را پیادهسازی میکنند باید تمام متدهایش را تعریف کنند. همچنین، یک کلاس میتواند چندین interface را پیادهسازی کند اما تنها از یک کلاس abstract ارثبری کند.
سلام و درود
بسیار عالی توضیح دادید
ممنون
موفق باشید اگر مایل هستید نوشته های دیگر دوره آموزشی سی شارپ را نیز از این لینک بخوانید.