Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Клас A rray






Не можна зрозуміти багато деталей роботи з масивами в C#, якщо не знати пристрій класу Array з бібліотеки FCL, нащадками якого є всі класи-масиви. Розглянемо наступні оголошення:

//Клас Array int[] ar1 = new int[5]; double[] ar2 ={5.5, 6.6, 7.7}; int[, ] ar3 = new Int32[3, 4];

Задамося природним запитанння: до якого або до яких класів належать об'єкти ar1, ar2 й ar3? Відповідь проста: всі вони належать до різних класів. Змінна ar1 належить до класу int[] - одномірному масиву значень типу int, ar2 - double[] - одномірному масиву значень типу double, ar3 - двовимірному масиву значень типу int. Наступне закономірне питання: а що загального є в цих трьох об'єктів? Насамперед, всі три класи цих об'єктів, як й інші класи, є нащадками класу Object, а тому мають загальні методи, успадковані від класу Object і доступні об'єктам цих класів.

У всіх класів, що є масивами, багато загального, оскільки всі вони є нащадками класу System.Array. Клас System.Array успадковує ряд інтерфейсів: ICloneable, IList, ICollection, IEnumerable, а, отже, зобов'язаний реалізувати всі їхні методи й властивості. Крім спадкування властивостей і методів класу Object і перерахованих вище інтерфейсів, клас Array має досить велике число власних методів і властивостей. Гляньте, як виглядає відношення спадкування на сімействі класів, що визначають масиви.


Рис. 14.1. Відношення спадкування на класах-масивах

Завдяки такому потужному батькові, над масивами визначені найрізноманітніші операції - копіювання, пошук, обіг, сортування, одержання різних характеристик. Масиви можна розглядати як колекції й улаштовувати цикли ForEach для перебору всіх елементів. Важливо й те, що коли в сімейства класів є загальний батько, то можна мати загальні процедури обробки різних нащадків цього батька. Для загальних процедур роботи з масивами характерно, що один або кілька формальних аргументів мають батьківський тип Array. Природно, усередині такої процедури може знадобитися аналіз - який реальний тип масиву переданий у процедуру.

Розглянемо приклад подібної процедури. Раніше я для печатки елементів масиву використав різні процедури PrintAr1, PrintAr2 і так далі, по однієї для кожного класу масиву. Тепер я приведу загальну процедуру, формальний аргумент якої буде належати батькові всіх класів-масивів, що дозволить передавати масив будь-якого класу як фактичний аргумент:

public static void PrintAr(string name, Array A){ Console.WriteLine(name); switch (A.Rank) { case 1: for(int i = 0; i< A.GetLength(0); i++) Console.Write(" \t" + name + " [{0}]={1}", i, A.GetValue(i)); Console.WriteLine(); break; case 2: for(int i = 0; i< A.GetLength(0); i++) { for(int j = 0; j< A.GetLength(1); j++) Console.Write(" \t" + name + " [{0}, {1}]={2}", i, j, A.GetValue(i, j)); Console.WriteLine(); } break; default: break; }}//PrintAr

От як виглядає створення масивів і виклик процедури печаті:

public void TestCommonPrint(){ //Клас Array int[] ar1 = new int[5]; double[] ar2 ={5.5, 6.6, 7.7}; int[, ] ar3 = new Int32[3, 4]; Arrs.CreateOneDimAr(ar1); Arrs.PrintAr(" ar1", ar1); Arrs.PrintAr(" ar2", ar2); Arrs.CreateTwoDimAr(ar3); Arrs.PrintAr(" ar3", ar3); }//TestCommonPrint

От результати виводу масивів ar1, ar2 й ar3.

Рис.14.2. Печать масивів. Результати роботи процедури PrintAr

Приведу деякі коментарі.

Перше, на що варто звернути увагу: формальний аргумент процедури належить базовому класу Array, спадкоємцями якого є всі масиви в CLR й, природно, всі масиви C#.

Для того щоб зберегти можливість роботи з індексами, як в одномірному, так й у двовимірному випадку, довелося організувати розбір випадків. Властивість Rank, що повертає розмірність масиву, використовується в цьому розборі.

До елементів масиву A, що має клас Array, немає можливості прямого доступу у звичайній манері - A [< індекси> ], але зате є спеціальні методи GetValue (< індекси>) і SetValue (< індекси>).

Природно, розбір випадків можна продовжити, додавши процедурі більшу функціональність.

Помітьте, якщо розбір випадків взагалі не робити, а використати PrintAr тільки для печатки одномірних масивів, то вона буде настільки ж проста, як і процедура PrintAr1, але зможе друкувати будь-які одномірні масиви, незалежно від типу їхніх елементів.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.008 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал