Программирование >>  Обработка исключительных ситуаций 

1 ... 98 99 100 [ 101 ] 102 103 104 ... 142


Обобщенные методы

Иногда удобно иметь отдельный метод, параметризованный каким-либо типом данных. Рассмотрим этот случай на примере метода сортировки.

Известно, что самого лучшего алгоритма сортировки не существует. Для различных объема, диапазона, степени упорядоченности данных и распределения ключей оптимальными могут оказаться разные алгоритмы. Стандартные методы сортировки реализуют алгоритмы, которые хороши для большинства применений, но не для всех, поэтому может возникнуть необходимость реализовать собственный метод.

В листинге 13.4 приведен пример сортировки методом выбора. Алгоритм состоит в том, что сначала выбирается наименьший элемент массива и меняется местами с первым элементом, затем просматриваются элементы, начиная со второго, и наименьший из них меняется местами со вторым элементом, и т. д., всего п - 1 раз. На последнем проходе цикла при необходимости меняются местами предпоследний и последний элементы массива.

Листинг 13.4. Сортировка выбором using System;

using System.Collecti ons.Generi с; using System.Text; namespace ConsoleApplicationl { class Program

static void Sort<T> ( ref T[] a ) 1

where T : IComparable<T> 2

T buf;

int n = a.Length;

for ( int i = 0; i < n - 1: ++i )

int im = i;

for ( int j = i + 1; j < n; ++j )

if ( a[j].CompareTo(a[im]) < 0 ) im = j; II Ъ

buf = a[i]; a[i] = a[im]; a[im] = buf;

static void MainO

Задание ограничений позволяет компилятору выполнять более строгий контроль типов и, таким образом, избежать многих ошибок, которые иначе проявились бы только во время выполнения программы.

Для задания значений по умолчанию типизированным элементам класса-прототипа используется ключевое слово default. С его помощью элементам ссылочного типа присваивается значение null, а элементам значимого типа - 0.



int:] а = {1, 6. 4, 2, 7. 5, 3 };

Sort<int>( ref а ); 4

foreach ( int elem in aa )) Console.WriteLineC elem );

double[] b = { 1.1, 5 2, 5.21, 2, 7, 6, 3 } :

SortC ref b ); 5

foreach ( double elem in b ) Console.WriteLineC elem ); string[] s = { qwe , qwer , df, asd };

SortC ref s ); 6

foreach ( string elem in s ) Console.WriteLineC elem );

Метод параметризован типом, Hai который накладывается ограничение (оператор 2), чтобы объекты класса-аргумента можно было сравнивать друг с другом с помощью метода CompareTo, использованного в операторе 3.

В главной программе (методе Main) метод Sort вызывается двумя способами: с явным указанием параметра-типа (оператор 4) и без указания параметра (операторы 5 и 6). Во втором случае компилятор по типу переданного в метод параметра самостоятельно определяет, какой именно тип используется при инстанцировании.

ПРИМЕЧАНИЕ-

Параметры-типы могут использоваться в списке параметров, возвращаемом типе и в теле универсального метода.

Итак, параметризованные типы и методы позволяют:

описывать способы хранения и алгоритмы обработки данных независимо от типов данных;

выполнять контроль типов во время компиляции, а не исполнения программы;

увеличить скорость обработки данных за счет исключения операций упаковки, распаковки и преобразования типа.

Как уже упоминалось, помимо классов-прототипов и обобщенных методов можно описать параметризованные интерфейсы, структуры и делегаты.

В помощью параметризованных интерфейсов можно определить список функций, которые могут быть реализованы различным образом для разных классов, реализующих эти интерфейсы. Параметризованные интерфейсы можно реализо-вывать в классе-прототипе, используя в качестве аргументов интерфейса параметры типа, реализующего интерфейс, или в обычном классе, подставляя в качестве параметров интерфейса конкретные типы.

Параметризованные делегаты позволяют создавать обобщенные алгоритмы, логику которых можно изменять передаваемыми в качестве параметров делегатами.



Частичные типы

Во вторую версию языка введена возможность разбивать описание типа на части и хранить их в разных физических файлах, создавая так называемые частичные типы (partial types). Это может потребоваться для классов большого объема или, что более актуально, для отделения части кода, сгенерированной средствами среды, от написанной программистом вручную. Кроме того, такая возможность облегчает отладку программы, позволяя отделить отлаженные части класса от новых.

Для описания отдельной части типа используется модификатор partial. Он может применяться к классам, структурам и интерфейсам, например:

public partial class А

public partial class A

После совместной компиляции этих двух частей получается такой же код, как если бы класс был описан обычным образом. Все части одного и того же частичного типа должны компилироваться одновременно, иными словами, добавление новой части к уже скомпилированным не допускается.

Модификатор partial не является ключевым словом и должен стоять непосредственно перед одним из ключевых слов class, struct или interface в каждой из частей. Все части определения одного класса должны быть описаны в одном и том же пространстве имен.

ПРИМЕЧАНИ Е-

Если модификатор parti al указывается для типа, описание которого состоит только из одной части, это не является ошибкой.

Модификаторы доступа для всех частей типа должны быть согласованными. Если хотя бы одна из частей содержит модификатор abstract или sealed, класс считается соответственно абстрактным или бесплодным.

Класс-прототип также может объявляться по частям, в этом случае во всех частях должны присутствовать одни и те же параметры типа с одними и теми же ограничениями.

Если частичный тип является наследником нескольких интерфейсов, в каждой части не требуется перечислять все интерфейсы: обычно в одной части объявляется один интерфейс и описывается его реализация, в другой части - другой интерфейс и т. д. Набором базовых интерфейсов для типа, объявленного в нескольких частях, является объединение базовых интерфейсов, определенных в каждой части.



1 ... 98 99 100 [ 101 ] 102 103 104 ... 142

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика