PDA

View Full Version : سوال: method hiding



irpersian20
شنبه 03 مرداد 1394, 20:23 عصر
سلام
دوستان اینجا در کلاش مشتق شده، ما چه در متد new رو بزاریم و چه نزاریم. هیچ فرقی نمی کنه. فقط یک warning رو از بین بردیم اگر new رو قبل از نوع برگشتی متد بزاریم.
منتها همش حرف از این زده که اگر new رو نزاریم، نمیدونم متد پنهان میشه و خلاصه کامپایلر نمیدونه کدام متد رو صدا بزنه و میره متد base رو صدا میزنه
منتها ما هر چی تست زدیم هیچ فرقی نکرد!


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace Sample4
{


class BaseClass
{
public void Method1()
{
Console.WriteLine("Base - Method1");
}
public void Method2()
{
Console.WriteLine("Base - Method2");
}
}


class DerivedClass : BaseClass
{
public void Method2()
{
Console.WriteLine("Derived - Method2");
}
}
class Program
{
static void Main(string[] args)
{
BaseClass bc = new BaseClass();
DerivedClass dc = new DerivedClass();
BaseClass bcdc = new DerivedClass();

bc.Method1();
dc.Method1();
dc.Method2();
bcdc.Method1();
bcdc.Method2();




Console.ReadLine();
}
}
}







using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace Sample4
{


class BaseClass
{
public void Method1()
{
Console.WriteLine("Base - Method1");
}
public void Method2()
{
Console.WriteLine("Base - Method2");
}
}


class DerivedClass : BaseClass
{
public new void Method2()
{
Console.WriteLine("Derived - Method2");
}
}
class Program
{
static void Main(string[] args)
{
BaseClass bc = new BaseClass();
DerivedClass dc = new DerivedClass();
BaseClass bcdc = new DerivedClass();

bc.Method1();
dc.Method1();
dc.Method2();
bcdc.Method1();
bcdc.Method2();




Console.ReadLine();
}
}
}




کلا به صورت تخصصی تر اگر بخواهیم بگیم، این کلمه new داره چی کار میکنه؟ چون اصولا new یک حافظه ای تخصیص میده. اینجا چطور؟

ناامید
شنبه 03 مرداد 1394, 20:42 عصر
سلام.
warning به شما هشدار میده که حواست باشه به متد کلاس پدر دسترسی نداری، این متدی که تو کلاس فرزند نوشتی اجرا میشه نه متد کلاس پدر.
به نظر میاد با کلمه new میگی که این یه متد جدیده و متد کلاس پدر نیست!!!.
نکته: اگر بخواید از متد کلاس پدر استفاده کنید از virtual - override استفاده کنید، در غیر اینصورت متد کلاس پدر را از دست خواهی داد.
class BaseClass
{
public void Method1()
{
Console.WriteLine("Base - Method1");
}
public virtual void Method2()
{
Console.WriteLine("Base - Method2");
}
}

class DerivedClass : BaseClass
{
public override void Method2()
{
Console.WriteLine("Drived - Method2");
}
}
class Program
{
static void Main(string[] args)
{
DerivedClass derived = new DerivedClass();
derived.Method2();
Console.ReadKey();
}
}

irpersian20
شنبه 03 مرداد 1394, 21:59 عصر
دوست عزیز شما چه new رو بنویسی و چه ننویسید، همان متد کلاس پدر فراخوانی میشه
شما می فرمائید new رو می نویسم که بگیم این مال پدر نیست و جدید هست؟ خوب باز هم مال پدر رو صدا میزنه
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace Sample4
{


class BaseClass
{
public void Method1()
{
Console.WriteLine("Base - Method1");
}
public void Method2()
{
Console.WriteLine("Base - Method2");
}
}


class DerivedClass : BaseClass
{
public new void Method2()
{
Console.WriteLine("Derived - Method2");
}
}
class Program
{
static void Main(string[] args)
{
BaseClass bc = new BaseClass();
DerivedClass dc = new DerivedClass();
BaseClass bcdc = new DerivedClass();

bc.Method1();
dc.Method1();
dc.Method2();
bcdc.Method1();
bcdc.Method2();




Console.ReadLine();
}
}
}

ناامید
شنبه 03 مرداد 1394, 22:54 عصر
تو این حالت به متد کلاس پدر دسترسی ندارید و یک متد جدید ایجاد کردید اما متد کلاس پدر مخفی است و با کلمه new میگیم که حواسمون هست که این متد همنام با متدی در کلاس پدر است و متد کلاس پدر مخفی میشه و از warning جلوگیری میکینم.
شما منظورتون این خطه:
BaseClass bcdc = new DerivedClass();
تو این خط از سازنده کلاس فرزند استفاده شده و Method2 هم در کلاس پدر و هم در کلاس فرزند است( متد کلاس پدر در کلاس فرزند مخفی است) و کلاس پدر فضای مورد نیاز متدی که در خودش است را تامین میکند(دو متد جدا داریم یکی در کلاس پدر و دیگری در فرزند) و کاری با متد کلاس فرزند ندارد (اصلا متد کلاس فرزند را ندارد).