آموزش سی شارپ – معرفی 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 در سی شارپ” بنویسید تا در دوره های بعدی از آنها استفاده کنیم.
خب این جلسه هم به پایان رسید باید به این نکته توجه کنید که مباحث بالا در برنامه نویسی تجاری اهمیت فراوانی دارد.
برای استفاده از تمامی جلسات از هشتگ #دوره آموزشی_سی_شارپ در سایت ما استفاده کنید.
منتظر جلسه ی بعدی دوره آموزشی سی شارپ باشید.
سلام و درود
بسیار عالی توضیح دادید
ممنون
موفق باشید اگر مایل هستید نوشته های دیگر دوره آموزشی سی شارپ را نیز از این لینک بخوانید.