10-mavzu: Interfeys ob’ektlarini nusxalash va tartiblash Reja: Ob'ektlarni nusxalash. Icloneable interfeysi Ob'ektlarni saralash. Icomparable interfeysi


Download 22.33 Kb.
bet1/2
Sana19.06.2023
Hajmi22.33 Kb.
#1603977
  1   2
Bog'liq
10-Interfeys ob’ektlarini nusxalash va tartiblash


10-mavzu: Interfeys ob’ektlarini nusxalash va tartiblash
Reja:
1. Ob'ektlarni nusxalash. ICloneable interfeysi
2. Ob'ektlarni saralash. IComparable interfeysi

1. Ob'ektlarni nusxalash. ICloneable interfeysi


Sinflar mos yozuvlar turlarini ifodalaganligi sababli, bu ulardan foydalanishga ba'zi cheklovlar qo'yadi. Jumladan:
class Program
{
static void Main(string[] args)
{
Person p1 = new Person { Name="Tom", Age = 23 };
Person p2 = p1;
p2.Name = "Alice";
Console.WriteLine(p1.Name); // Alice
Console.Read();
}
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

Bunday holda, p1 va p2 ob'ektlari xotiradagi bir xil ob'ektga ishora qiladi, shuning uchun p2 dagi xususiyatlarning o'zgarishi p1 ga ham ta'sir qiladi.


P2 o'zgaruvchisini yangi ob'ektga ishora qilish uchun, lekin p1 dan qiymatlar bilan biz ICloneable interfeysini amalga oshirish orqali klonlashni qo'llashimiz mumkin:
public interface ICloneable
{
object Clone();
}
Person sinfidagi interfeysni amalga oshirish quyidagicha ko'rinishi mumkin:
class Person : ICloneable
{
public string Name { get; set; }
public int Age { get; set; }
public object Clone()
{
return new Person { Name = this.Name, Age = this.Age };
}
}

Foydalanish:


class Program
{
static void Main(string[] args)
{
Person p1 = new Person { Name="Tom", Age = 23 };
Person p2 = (Person)p1.Clone();
p2.Name = "Alice";
Console.WriteLine(p1.Name); // Tom
Console.Read();
}
}

Endi hamma narsa yaxshi nusxa ko'chiriladi, p2 xususiyatlarining o'zgarishi p1 xususiyatlariga ta'sir qilmaydi.


Nusxa ko'chirish kodini qisqartirish uchun ob'ekt nusxasini qaytaradigan maxsus MemberwiseClone () usulidan foydalanishimiz mumkin:
class Person : ICloneable
{
public string Name { get; set; }
public int Age { get; set; }
public object Clone()
{
return this.MemberwiseClone();
}
}

Bu usul sayoz nusxalashni amalga oshiradi. Biroq, bu nusxa ko'chirish etarli bo'lmasligi mumkin. Masalan, Person sinfi Company ob'ektiga havolani o'z ichiga oladi deylik:


class Person : ICloneable
{
public string Name { get; set; }
public int Age { get; set; }
public Company Work { get; set; }
public object Clone()
{
return this.MemberwiseClone();
}
}
class Company
{
public string Name { get; set; }
}

Bunday holda, nusxa ko'chirishda yangi nusxa bir xil Company ob'ektiga ishora qiladi:


Person p1 = new Person { Name="Tom", Age = 23, Work= new Company { Name = "Microsoft" } };
Person p2 = (Person)p1.Clone();
p2.Work.Name = "Google";
p2.Name = "Alice";
Console.WriteLine(p1.Name); // Tom
Console.WriteLine(p1.Work.Name); // Google - va Microsoft bo'lishi kerak

Sayoz nusxalash faqat murakkab ob'ektlarni emas, balki ibtidoiy turlarni ifodalovchi xususiyatlar uchun ishlaydi. Va bu holda siz chuqur nusxalashdan foydalanishingiz kerak:


class Person : ICloneable
{
public string Name { get; set; }
public int Age { get; set; }
public Company Work { get; set; }
public object Clone()
{
Company company = new Company { Name = this.Work.Name };
return new Person
{
Name = this.Name,
Age = this.Age,
Work = company
};
}
}
class Company
{
public string Name { get; set; }
}

2. Ob'ektlarni saralash. IComparable interfeysi


.NET o'rnatilgan to'plam va massiv sinflarining aksariyati saralashni qo'llab-quvvatlaydi. Odatda Sort() deb ataladigan yagona usul yordamida siz bir vaqtning o'zida butun ma'lumotlar to'plamini o'sish tartibida saralashingiz mumkin. Masalan:
public interface IComparable
{
int CompareTo(object o);
}
CompareTo usuli joriy ob'ektni object o parametri sifatida uzatiladigan ob'ekt bilan solishtirish uchun mo'ljallangan. Chiqishda u uchta qiymatdan biriga ega bo'lishi mumkin bo'lgan butun sonni qaytaradi:



  • Noldan kichik. Bu shuni anglatadiki, joriy ob'ekt parametr sifatida uzatiladigan ob'ekt oldida bo'lishi kerak

  • Nolga teng. Demak, ikkala ob'ekt ham tengdir

  • Noldan katta. Bu joriy ob'ekt parametr sifatida qabul qilingan ob'ektdan keyin bo'lishi kerakligini anglatadi.

Masalan, Person klassi mavjud:


class Person : IComparable
{
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(object o)
{
Person p = o as Person;
if (p != null)
return this.Name.CompareTo(p.Name);
else
throw new Exception("Ikki ob'ektni taqqoslab bo'lmaydi ");
}
}

Bu yerda taqqoslash mezoni sifatida Person obyektining Name xossasi tanlanadi. Shuning uchun taqqoslashda, aslida joriy ob'ektning Name xossasining qiymatini va parametr orqali o'tgan ob'ektning Name xossasini taqqoslash mavjud. Agar bir vaqtda ob'ektni Person turiga o'tkazib bo'lmasa, istisno chiqariladi.


Ilova:
Person p1 = new Person { Name = "Bill", Age = 34 };


Person p2 = new Person { Name = "Tom", Age = 23 };
Person p3 = new Person { Name = "Alice", Age = 21 };
Person[] people = new Person[] { p1, p2, p3 };
Array.Sort(people);
foreach(Person p in people)
{
Console.WriteLine($"{p.Name} - {p.Age}");
}
IComparable interfeysi umumiydir, shuning uchun biz undan Person sinfida foydalanishni qisqartirishimiz va soddalashtirishimiz mumkin:
class Person : IComparable

{
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(Person p)
{
return this.Name.CompareTo(p.Name);
}
}

Download 22.33 Kb.

Do'stlaringiz bilan baham:
  1   2




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling