Эслатма: Агар класс IComparable интерфейсини амалга ошираётган бўлса, у холда Equals метлди хамда у билан боғланган GetHashCode методини қайта аниқлаш талаб илинади. Ҳар икки метод базавий object классидан мерос қилиб олинган.
9.3- листингда муносабат амали Monster класси учун қайта аниқланган. Таққослаш критерияси сифатида health майдони олинган. Тенгликни текширишда объектларнинг ҳамма майдонлари жуфт-жуфти билан таққосланади.
using System;
namespace ConsoleApplication1
{
class Monster : IComparable
{
public Monster( int health, int ammo, string name )
{
this.health = health;
this.ammo = ammo;
this.name = name;
}
public override bool Equals( object obj )
{
if ( obj == null || GetType() != obj.GetType() ) return false;
Monster temp = (Monster) obj;
return health == temp.health &&
ammo == temp.ammo &&
name == temp.name;
}
public override int GetHashCode()
{
return name.GetHashCode();
}
public static bool operator == ( Monster a, Monster b )
{
return a.Equals( b );
}
public static bool operator != ( Monster a, Monster b )
{
return ! a.Equals( b );
}
public static bool operator < ( Monster a, Monster b )
{
return ( a.CompareTo( b ) < 0 );
}
public static bool operator > ( Monster a, Monster b )
{
return ( a.CompareTo( b ) > 0 );
}
public static bool operator <= ( Monster a, Monster b )
{
return ( a.CompareTo( b ) <= 0 );
}
public static bool operator >= ( Monster a, Monster b )
{
return ( a.CompareTo( b ) >= 0 );
}
public int CompareTo( object obj )
{
Monster temp = (Monster) obj;
if ( this.health > temp.health ) return 1;
if ( this.health < temp.health ) return -1;
return 0;
}
string name;
int health, ammo;
}
class Class1
{ static void Main()
{
Monster Вася = new Monster( 70, 80, "Вася" );
Monster Петя = new Monster( 80, 80, "Петя" );
if ( Вася > Петя ) Console.WriteLine( "Вася Петядан катта");
else if ( Вася == Петя ) Console.WriteLine( "Вася == Петя");
else Console.WriteLine( "Вася Петядан кичик");
}
}
}
Дастур ишининг натижаси қуйидагича:
Вася Петядан кичик
Объектларни клонлаш.
Клонлаш — бу объект нусхасини яраиш демакдир. Объектнинг нусхаси клон деб аталади. Маълумки, ҳавола типидаги битта объектни ҳавола кўчирилганда объектнинг ўзи эмас, балки унинг ҳаволаси кўчирилади. Агар хотиранинг бошқа соҳасига объект майдонини кўчириш талаб қилинса, у холда MemberwiseClone методидан фойдаланиш мумкин. Бу методни иҳтиёрий объект object классидан мерос қилиб олади. Бунда объект майдони кўрсатаётган объектларнинг ўзи ҳавола бўлади ва нусхалари кўчирилмайди. Бу ҳолатни юзки клонлаш деб аталади.
Тўла эркли объектларни яратиш учун хотирада объект дарахтининг тўла дубликати, яъни объект майдони ҳавола қилаётган объектлар яратилаётганда чуқур клонлаш талаб қилинади. Чуқур клонлаш алгоритми ўта муракаб ҳисобланади, чунки объектнинг барча ҳаволаларини рекурсив айланиб чиқиши талаб қилинади ва циклик боғланишларни назорат қилиб бориш зарур бўлади.
Ҳусусий клонлаш алгоритмларига эга бўлган объект, ICloneable интерфейсининг вориси сифатида эълон қилиниши хамда унинг Clone методини қайта аниқланиши керак.9.4- шунингдек, ICloneable интерфейси амалга оширилган. Намойиш қилиш мақсадида объект клони номига "Клон" сўзи қўшиб қўйилган.
using System;
Do'stlaringiz bilan baham: |