:: Меню ::

Головна
  • Про сайт
  • Введення
  • Середовище програмування VB .NET: Visual Studio .NET
  • Вирази, оператори і передача управління
  • Класи і об'єкти
  •  Спадкоємство і інтерфейси
  • Обробка подій і делегати
  • Обробка помилок в VB .NET
  • Форми Windows, графічний вивід і друк
  • Уведення-виведення
  •  Багатопотокові застосування
  • Підтримка баз-даних в VB .NET
  • Короткий огляд ASP .NET
  • Складки .NET, установка додатків і COM Interop
  • Книга для гостей
    Контакти
    Добавити у вибране

    :: Друзі ::

     
     

    :: Лічильники ::

    = =

     

     

     

     

    Icollection

    Інтерфейс Icollection визначається похідним від Ienumerable; він доповнює цей інтерфейс трьома властивостями, доступними тільки для читання, і одним новим методом. Клас Icollection рідко реалізується самостійно. Як правило, він утворює базу для інтерфейсів Ilist і Idictionary (див. нижчий). Члени цього інтерфейсу перераховані в таблиці. 5.2.

    Таблиця 5.2. Члени інтерфейсу Icollection

    Метод/властивість

    Опис

    Count (властивість) Повертає кількість елементів в колекції
    Issynchronized (властивість) Використовується в багатопотокових застосуваннях (див. розділ 12). Властивість повертає True, якщо доступ до колекції синхронізується з урахуванням багатопотокового доступу
    Syncroot (властивість) Також використовується в багатопотокових застосуваннях (див. розділ 12). Властивість повертає об'єкт для синхронізації доступу до колекції
    Соруто (метод) Копіює елементи з колекції в масив, починаючи із заданої позиції

     

    Інтерфейс Icollection реалізується класом System.Collections.CollectionBase.

    Ilist

    Інтерфейс Ilist забезпечує вибірку елементів колекції по індексу. Зрозуміло, оскільки цей інтерфейс визначається похідним від I Enumerable, при цьому зберігається можливість використання For-each. Ієрархія спадкоємства Ilist виглядає таким чином:

    Ienumerable->icollection->ilist

    Інтерфейс Ilist відносно складний — він складається з трьох властивостей і семи методів (таблиця. 5.3). Нагадаємо, що деякі з методів можуть бути порожніми, якщо в якомусь конкретному класі їх реалізація не має сенсу.

    Таблиця 5.3. Члени інтерфейсу Ilist

    Метод/властивість

    Опис

    Isfixedsize (властивість) Логічна властивість. Показує, чи має колекція фіксований розмір
    Isreadonly (властивість) Логічна властивість. Показує, чи доступна колекція тільки для читання
    Item (властивість) Властивість доступна для читання і запису. Використовується для отримання і надання значення об'єкту із заданим індексом
    Add (Byval value As Object) As Integer (метод)

    Включає об'єкт в поточну позицію списку. Метод повинен повертати індекс, привласнений доданому елементу

    Clear (метод)

    Видаляє всі елементи із списку

    Contains (Byval value As Object) As Boolean (метод)

    Метод призначений для перевірки наявності в списку заданого значення. Ефективна реалізація цього методу іноді буває вельми нетривіальним завданням. Якщо елемент присутній в списку, метод повертає True; інакше повертається False

    Indexof (Byval value As Object) As Integer (метод)

    Повертає індекс заданого об'єкту в списку (програміст також повинен враховувати ефективність реалізації цього методу)

    Insert(Byval index As Integer, Byval value As Object) (метод)

    Вставляє об'єкт в задану позицію списку

    Remove(Byval value As Object) (метод)

    Видаляє перше входження заданого об'єкту в списку

    Remove(Byval index As Integer) (метод)

    Видаляє елемент, що знаходиться в заданій позиції

     

    Інтерфейс Ilist реалізується класом System.Collections.CollectionBase.

    Idictionary

    Інтерфейс Idictionary представляє колекцію, в якій доступ до даних здійснюється по ключу, — як в хэш-таблицах, описаних в попередньому розділі. Більш того, клас хэш-таблиц в числі інших реалізує інтерфейси Idictionary, Icollection, Enumerable і Icloneable!

    Хоча інтерфейс Idictionary оголошується похідним від Enumerable і переходу до наступного елементу може здійснюватися методом Movenext, зазвичай така можливість не використовується — колекції, реалізовуючі Idictionary, орієнтуються насамперед на звернення по ключу, а не на послідовний перебір елементів. З цієї причини інтерфейс Idictionary залежить від інтерфейсу Idic-tionaryenumerator, який розширює Enumerator і доповнює його трьома новими властивостями:

    • Entry: повертає пару «ключ/значення» для поточного елементу словника.
    • Кеу: повертає поточний ключ.
    • Value: повертає посилання на поточне значення.

    У .NET Framework входить клас Dictionarybase. Визначаючи клас похідним від Dictionarybase, ви отримуєте в своє розпорядження всю функціональність інтерфейсу Idictionary.

    Члени класу Idictionary перераховані в таблиці. 5.4.

    Оскільки ключі в асоціативних колекціях мають бути унікальними, при реалі-зациі більшості методів необхідно спочатку перевірити, чи не був заданий ключ використаний раніше. Властивість Keys повертає об'єкт, реалізовуючий Icollection; унікальність ключа перевіряється методом, Соп1а1п5 інтерфейсу Icollection.

    Таблиця 5.4. Члени інтерфейсу Idictionary

    Метод/властивість

    Опис

    Isfixedsize (властивість)

    Логічна властивість. Показує, чи має колекція фіксований розмір

    Isreadonly (властивість)

    Логічна властивість. Показує, чи доступна колекція тільки для читання

    Item (властивість)

    Властивість доступна для читання і запису. Використовується для отримання і надання значення об'єкту із заданим індексом

    Keys (властивість)

    Повертає об'єкт, що реалізовує інтерфейс Icollection і що містить всі ключі асоціативної колекції

    Values (властивість)

    Повертає об'єкт, що реалізовує інтерфейс Icollection і що містить всі значення асоціативної колекції

    Add(Byval key As Object, Byval value As Object) (метод)

    Додає об'єкт із заданим ключем (ключ має бути унікальним)

    Clear (метод)

    Видаляє всі елементи з асоціативної колекції

    Contains (Byval key As Object) As Boolean (метод)

    Шукає значення із заданим ключем

    Getenumerator (метод)

    Повертає об'єкт Idictionaryenumerator для роботи з ключами і значеннями

    Remove(Byval key As Object) (метод)

    Видаляє елемент із заданим ключем

    Icomparable

    Припустимо, колекцію об'єктів Employee потрібно було відсортувати по заробітній платі. Звичайно, операцію сортування було б зручно реалізувати безпосередньо в класі Emplоуєе, щоб сортування простого або динамічного масиву об'єктів цього класу виконувалося так само просто, як сортування строкових масивів. Виявляється, порядок сортування елементів, використовуваний методом Sort класів Array і Arraylist, визначається інтерфейсом Icomparable (строкові масиви інтерфейс Icomparabl e сортує в порядку ASCII-кодов). Інтерфейс складається з єдиного методу Compareto: Function Compareto(Byvalobj As Object) As Integer Метод повертає наступні значення:

    • негативне число, якщо поточний екземпляр менше заданого об'єкту;
    • нуль, якщо поточний екземпляр дорівнює заданому об'єкту;
    • позитивне число, якщо поточний екземпляр більше заданого об'єкту.

    Наступна версія класу Employee реалізує інтерфейси lenumerable і Icomparable і сортує масив по убуванню заробітної плати:

    Public Class Employee

    Implements Icomparable

    Private m_name As String

    Private m_salary As Decimal

    Private Const LIMIT As Decimal =0.10

    Public Sub New(Byval thename As String,byval cursalary As Decimal)

    m_name = thename m_salary = cursalary

    End Sub

    Public Function Compareto(Byval anemployee As Object) As Integer _

    Implements Icomparable.CompareTo

    If Ctype(anemployee,employee).Salany < Me.Salary Then Return -1

    El self Ctypetanemployee.Employee).Salary = Me.Salary Then

    Return 0

    Elself Ctypecanemployee,employee).Salary > Me.Salary Then

    Return 1

    End If

    End Function

    Public Readonly Property Thename() As String Get

    Return m_name End Get End Property

    Public Readonly Property Salary() As Decimal Get

    Return Myclass.m_Salary

    End Get End Property

    Public Overridable Overloads Sub Raisesalary(Byval Percent As Decimal)

    If Percent > LIMIT Then

    ' Операція заборонена - необхідний пароль

    Console.WriteLine("NEED PASSWORD TO RAISE SALARY MORE " & _

    "THAN LIMIT!!!!")

    Else

    m_salary =(1 + Percent) * m_salary

    End If

    End Sub

    Public Overridable Overloads Sub Raisesalary(Byval Percent As Decimal._

    Byval Password As String) If Password = "special" Then

    m_salary =(1 + Percent) * m_salary

    End If

    End Sub

    End Class

    Для тестування нової версії класу можна скористатися наступною програмою:

    Sub Main()

    Dim torn As New Employee("Tom". 50000)

    Dim sally'as New Employee("Sally", 60000)

    Dim joe As New Employee("Joe", 20000)

    Dim gary As New Employєє("Gary", 1)

    Dim theemployees() As Employee = _

    {torn, sally, joe. gary}

    Array.Sort(theemployees)

    ' Порядок сортування визначається Compareto!

    Dim aemployee As Employee

    For Each aemployee In theemployees

    Console.WriteLine(aemployee.TheName & "has yearly salary $"

    & Formatnumbertaemployee.Salary)) Next

    Console.ReadLine()

    End Sub

    Результат показаний на мал. 5.9.

    Мал. 5.9. Сортування по нестандартному критерію з використанням Icomparable

    Інтерфейс Icomparer

    .NET Framework дозволяє виконувати сортування по декількох критеріях. Наприклад, щоб упорядкувати масив працівників спочатку по заробітній платі, а потім по імені (у групах з однаковою зарплатою) слід реалізувати інтерфейс Icomparer, що містить єдиний метод Сотрагето. При цьому ви зможете скористатися одній з переобтяжених версій Array. Sort (або Arraylist. Sort), яка має наступну сигнатуру:

    Public Shared Sub Sort(Byval array As Array. Byval comparer As Icomparer)

    Зазвичай в програмі створюється окремий клас, реалізовуючий Icomparer, і екземпляр цього класу передається методу Sort. Приклад такого класу приведений нижче. Звернете увагу на виділений рядок — в ній імена працівників передаються у вигляді рядків методу Compare класу String:

    Public Class Sortbyname

    Implements Icomparer

    Public Function Compareto(Byval firstemp As Object.ByVal

    secondemp=as Object) As Integer Implements Icomparer.Compare

    Dim temp1 As Employee = Ctype(firstemp,employee)

    Dim temp2 As Employee = Ctype(secondemp.Employee)

    Return

    String.Compare(templ.TheName. temp2.TheName)

    End Function

    End Class

    Приклад процедури Sub Main з використанням цього класу:

    Submain()

    Dim torn As New Employee("Tom", 50000)

    Dim sally As New Employee("Sally". 60000)

    Dim sam As New Employee("Sam". 60000)

    Dim ted As New Employee("Ted". 50000)

    Dim theemployees() As Employee = _

    {torn.sally,sam.ted}

    Array.Sort(theemployees)

    Dim Sortingbyname As Sortbyname = New Sortbyname()

    Array.Sort(theemployees,sortingbyname)

    Dim aemployee As Employee

    For Each aemployee In theemployees

    Console.WriteLine(aemployee.TheName & "has yearly salary $" &

    Formatnumbercaemployee.Salary))

    Next

    Console. Readline() End Sub .

    Результат показаний на мал. 5.10

    Мал. 5.10. Сортування по декількох критеріях з використанням Icomparer

    У програмі можна визначити декілька класів, реалізовуючих Icomparer. Їх послідовне застосування дозволяє виконувати багаторівневе сортування довільної глибини.

     




    :: Наша кнопка ::

    Отримати код:

    Підтримайте наш сайт і розмістіть нашу кнопку на своєму ресурсі.


    :: Реклама ::

    Скачати безкоштовно програму Microsoft Front Page 2003


    :: Посилання ::

    -


     

     

     


    Copyright ©