PDA

View Full Version : اورراید Object



the Dead
جمعه 19 بهمن 1386, 01:48 صبح
هنگامی که در یک کلاس یک متد را Override میکنیم که خود اصل ان متد Override نمیشود و در صورت استفاده از کلاس اصلی متد (override نشده) مد نظر قائل خواهد بود. درسته؟
خوب حالا اینجا ما متد را در کلاس Person اورراید کردیم ولی در صورت استفاده از کلاس object باز هم از متد Override شده در فراخوانی استفاده میشود. چرا؟

Program.cs
namespace ObjectOverride
{
class Program
{
static void Main(string[] args)
{
Person p1 = new Person("Homer", "Simpson", 50);
Person p2 = new Person("Homer", "Simpson",50);
// p1.Equals(p2);
Console.WriteLine(object.Equals(p1, p2));
Console.WriteLine(object.ReferenceEquals(p1,p2));
}
}
}



person.cs
namespace ObjectOverride
{
class Person
{
public string fName;
public string lName;
public byte personAge;

public Person(string firstName, string lastName, byte age)
{
fName = firstName;
lName = lastName;
personAge = age;
}
public Person()
{ }
public override string ToString()
{
string myState;
myState = string.Format("[First Name: {0}; Last Name: {1}; Age: {2}]",
fName, lName, personAge);
return myState;
}
public override bool Equals(object obj)
{
if (obj is Person && obj != null)
{
Person temp;
temp = (Person)obj;
if (temp.fName == this.fName && temp.lName == this.lName && temp.personAge == this.personAge)
{
return true;
}
else
{
return false;
}
}
return false;
}
public override int GetHashCode()
{
return this.ToString().GetHashCode();
}


}
}

رضا عربلو
جمعه 19 بهمن 1386, 03:10 صبح
متد Equals در کلاس System.Object بصورت virtual تعریف شده است این بدان معنی است که شما می توانید در کلاس های که از System.Object به ارث می برید این متد را override کنید (یعنی این override کردن انتخابی می باشد و شما می توانید این کار را انجام ندهید )

حالا شما چون object.Equals را آورده اید پس متد استاتیک Equals کلاس Object را فرا می خوانید و در صورتی که می خواهید متد ovveride شده در کلاس Person را بکار ببرید بایستی بنویسید


Console.WriteLine(Person.Equals(p1, p2));



این قابلیت override کردن یکی از اشکال polymorphism است

Masoud_TB
جمعه 19 بهمن 1386, 13:18 عصر
نه!!!!! چرا اطلاعات نادرست می دین!!!!!
این کد بایددرست عمل کند. وقتی می گوییم polymorphism که دیگر استثنا ندارد!!!!




public class Person
{

public int Age;
public Person(int Age)
{
this.Age = Age;
}
public override bool Equals(object obj)
{
if(((Person)obj).Age == this.Age)
return true;
return false;
}
}
این هم تست آن


static void Main(string[] args)
{
Person p = new Person(20);
Person p2 = new Person(20);
if(object.Equals(p,p2))
{
Console.WriteLine("OK");
}

}
و این هم تصویر نتیجه:

رضا عربلو
جمعه 19 بهمن 1386, 15:39 عصر
دوست عزیز Masoud_TB می شه بپرسم کجا اطلاعات نادرست داده ام!
در ضمن اشتباه شما و دوست اولمان این است که متد publicvirtualbool Equals(object obj); را اورراید کرده اید ولی در کدتان از متد publicstaticbool Equals(object objA, object objB); استفاده کرده اید. و همچنین خودم که متوجه تفاوت این دو نوع پیاده سازی نشدم.

the Dead
جمعه 19 بهمن 1386, 16:53 عصر
دوست عزیز Masoud_TB می شه بپرسم کجا اطلاعات نادرست داده ام!
در ضمن اشتباه شما و دوست اولمان این است که متد publicvirtualbool Equals(object obj); را اورراید کرده اید ولی در کدتان از متد publicstaticbool Equals(object objA, object objB); استفاده کرده اید. و همچنین خودم که متوجه تفاوت این دو نوع پیاده سازی نشدم.

خوب آقا رضا این که معلومه ده منم سوالم همینه دیگه. من رفتم متد Virtual کلاس Object را Override کردم
و بعد رفتم از متد استاتیک کلاس آبجکت برای مقایسه استفاده کردم ولی نکته ای که اینجا وجود داره اینه که
در هنگام فراخوانی این خط object.Equals(p1, p2؛ برنامه به متد override شده من رجوع میکنه به جای اینکه به متد اصلی که در کلاس آبجکت تعریف شده مراجعه کنه؟؟؟؟

یعنی منظورم اینه که در برنامه من این دو دستور چرا یه کار میکنند؟
Person.Equals(p, p2)
object.Equals(p, p2)

رضا عربلو
جمعه 19 بهمن 1386, 17:57 عصر
فکر می کنم این به نحوه پیاده سازی متد public static bool Equals(object objA, object objB); در کلاس System.Object بر می گرده که احتمالاً از متد public virtual bool Equals(object obj); درون بدنه خودش استفاده می کنه!

Masoud_TB
شنبه 20 بهمن 1386, 08:55 صبح
من نمی دونم شما روی چه حسابی می گویید متد Equal یک متد Static است!!!؟
تصویر سمت چپ لیست اعضاء کلاس Object توی MSDN است. دقت کنین که فقط متد References Equal یک متد Static است.
تصویر سمت راست پیاده سازی متد Equal رو نشون میده که توش نامی از static من نمی بینم!!!

اگر من اشتباه می کنم مرا روشن کنین:

رضا عربلو
شنبه 20 بهمن 1386, 20:01 عصر
در کنسول اپلیکشن بنویس System.Object بعد بر روری Object رایت کلیک کن و گزینه go to definition را انتخاب کن می بینی که دو پیاده سازی برای متد Equals وجود دارد:
public static bool Equals(object objA, object objB);
و
public virtual bool Equals(object obj);

در شکل سمت راستی که پست کردی متد استاتیک با یک کمی تغییر آیکون متد (مکعب ریز آبی رنگ) نشان داده شده است مضافاً بر اینکه در بخش Disassemblerاش هم می تونی modifier استاتیک را ببینی.
ضمناً از چه دی کامپایلری استفاده کردی؟ Lutz Reorder?