PDA

View Full Version : سوال: تفاوت بین Virtual Method و Method Over Hidding در چیست؟



RamezanBeik
پنج شنبه 20 اسفند 1394, 06:57 صبح
با سلام خدمت اساتید محترم
این سوالی که در عنوان عرض کردم ذهن بنده در گیر کرده
لطفا اگه ممکنه این تفاوت رو بیان بفرمایید.

parvizwpf
جمعه 21 اسفند 1394, 11:40 صبح
در واقع 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()"
}
}
}

RamezanBeik
دوشنبه 24 اسفند 1394, 08:44 صبح
در واقع 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()"
}
}
}


خیلی ممنون از راهنمایی شما

RamezanBeik
دوشنبه 24 اسفند 1394, 08:46 صبح
ببخشید در کد فوق میشه مفهوم

a = new B();
a.Foo(); // output --> "A::Foo()"

را یه توضیح بدید.
ممنون می شم.

hadiroosta
پنج شنبه 27 اسفند 1394, 15:43 عصر
سلام دوست عزیز

در مورد موضوع virtual و یا over

این موضوع در وراثت معنی داره و وقتی شما میخواهید که متد شما در کلاس فرزند حتما override بشه یعنی کلاس فرزند پیاده سازی خودش رو از اون متد داشته باشه ان متد را با صورت virtual معرفی میکند تا کلاسهایی که از کلاس ما به ارث برده میشن این متد را خودشون پیاده کنند

ولی اگر شما در کلاس پدر این متد را بدون کلمه virtual معرفی کنید کلاس فرزند میتونه (اختیاری ) ان متد را override بکنه و یا هیچ کاری باهاش نداشته باشه و از اون متد پدر استفاده کنه

hadiroosta
پنج شنبه 27 اسفند 1394, 15:50 عصر
در مورد کد a = new B();a.Foo(); // output --> "A::Foo()"

این موضوع وراثت را داره توضیح میده و اینکه در وراثت حالت is a برقرار هست یعنی اینکه کلاس B که از کلاس a

ارث بری کرده همان (is a) کلاس a هست

csvbcscp
جمعه 28 اسفند 1394, 10:57 صبح
139645
override متد کلاس پایه رو جایگزین میکنه. در حالی که new متد کلاس پایه رو پنهان میکنه
کلمه کلیدی virtual باعث میشه که یک متد، پراپرتی، ایندکسر یا ایونتی که در کلاس پایه تعریف میشه، در کلاس های مشتق شده قابل جایگزین یا همان override کردن باشه
متد، پراپرتی، ایندکسر یا ایونتی که به صورت virtual یا abstract تعریف شده باشه، با استفاده از کلمه کلیدی override در کلاس مشتق شده قابل جایگزین شدنه.
کلمه کلیدی new برای پنهان کردن متد، پراپرتی، ایندکسر و یا ایونت های کلاس پایه استفاده میشه.
Hiding در سی شارپ معادل Shadowing در vb است.