با سلام خدمت اساتید محترم
این سوالی که در عنوان عرض کردم ذهن بنده در گیر کرده
لطفا اگه ممکنه این تفاوت رو بیان بفرمایید.
با سلام خدمت اساتید محترم
این سوالی که در عنوان عرض کردم ذهن بنده در گیر کرده
لطفا اگه ممکنه این تفاوت رو بیان بفرمایید.
در واقع method hiding صحیحه و مفهومی بنام over hiding نداریم دقیقا زمانی که شما نمیخواهید از متد شما شکل دیگری در کلاسهای فرزند استفاده بشه متد خودتون رو بصورت زیر hide میکنید :
در اصل میخواهید بگید که کاری به کلاس بیس خودت نداشته باش و پیاده سازی خودت رو انجام بده
using System;
namespace Polymorphism
{
class A
{
public void Foo() { Console.WriteLine("A::Foo()"); }
}
class B : A
{
public new void Foo() { Console.WriteLine("B::Foo()"); }
}
class Test
{
static void Main(string[] args)
{
A a;
B b;
a = new A();
b = new B();
a.Foo(); // output --> "A::Foo()"
b.Foo(); // output --> "B::Foo()"
a = new B();
a.Foo(); // output --> "A::Foo()"
}
}
}
ببخشید در کد فوق میشه مفهوم
a = new B();
a.Foo(); // output --> "A::Foo()"
را یه توضیح بدید.
ممنون می شم.
آخرین ویرایش به وسیله Mahmoud.Afrad : دوشنبه 24 اسفند 1394 در 10:49 صبح
سلام دوست عزیز
در مورد موضوع virtual و یا over
این موضوع در وراثت معنی داره و وقتی شما میخواهید که متد شما در کلاس فرزند حتما override بشه یعنی کلاس فرزند پیاده سازی خودش رو از اون متد داشته باشه ان متد را با صورت virtual معرفی میکند تا کلاسهایی که از کلاس ما به ارث برده میشن این متد را خودشون پیاده کنند
ولی اگر شما در کلاس پدر این متد را بدون کلمه virtual معرفی کنید کلاس فرزند میتونه (اختیاری ) ان متد را override بکنه و یا هیچ کاری باهاش نداشته باشه و از اون متد پدر استفاده کنه
در مورد کد a = newB();a.Foo(); // output --> "A::Foo()"
این موضوع وراثت را داره توضیح میده و اینکه در وراثت حالت is a برقرار هست یعنی اینکه کلاس B که از کلاس a
ارث بری کرده همان (is a) کلاس a هست
MethodOverriding-MethodHiding.jpg
override متد کلاس پایه رو جایگزین میکنه. در حالی که new متد کلاس پایه رو پنهان میکنه
کلمه کلیدی virtual باعث میشه که یک متد، پراپرتی، ایندکسر یا ایونتی که در کلاس پایه تعریف میشه، در کلاس های مشتق شده قابل جایگزین یا همان override کردن باشه
متد، پراپرتی، ایندکسر یا ایونتی که به صورت virtual یا abstract تعریف شده باشه، با استفاده از کلمه کلیدی override در کلاس مشتق شده قابل جایگزین شدنه.
کلمه کلیدی new برای پنهان کردن متد، پراپرتی، ایندکسر و یا ایونت های کلاس پایه استفاده میشه.
Hiding در سی شارپ معادل Shadowing در vb است.