История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...
Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...
Топ:
Процедура выполнения команд. Рабочий цикл процессора: Функционирование процессора в основном состоит из повторяющихся рабочих циклов, каждый из которых соответствует...
Техника безопасности при работе на пароконвектомате: К обслуживанию пароконвектомата допускаются лица, прошедшие технический минимум по эксплуатации оборудования...
Установка замедленного коксования: Чем выше температура и ниже давление, тем место разрыва углеродной цепи всё больше смещается к её концу и значительно возрастает...
Интересное:
Финансовый рынок и его значение в управлении денежными потоками на современном этапе: любому предприятию для расширения производства и увеличения прибыли нужны...
Аура как энергетическое поле: многослойную ауру человека можно представить себе подобным...
Берегоукрепление оползневых склонов: На прибрежных склонах основной причиной развития оползневых процессов является подмыв водами рек естественных склонов...
Дисциплины:
|
из
5.00
|
Заказать работу |
Содержание книги
Поиск на нашем сайте
|
|
|
|
Специальным частным случаем универсального класса является класс, не объявляющий сам параметров, но разрешающий делать это своим методам. Давайте начнем рассмотрение универсальности с этого частного случая. Вот как выглядит класс, содержащий универсальный метод swap:
class Change{ static public void Swap<T>(ref T x1, ref T x2) { T temp; temp = x1; x1 = x2; x2 = temp; }}Как видите, сам класс в данном случае не имеет родовых параметров, но зато универсальным является статический метод класса swap, имеющий родовой параметр типа T. Этому типу принадлежат аргументы метода и локальная переменная temp. Всякий раз при вызове метода ему, наряду с фактическими аргументами, будет передаваться и фактический тип, заменяющий тип T в описании метода. О некоторых деталях технологии подстановки и выполнения метода поговорим в конце лекции, сейчас же лишь отмечу, что реализация вызова универсального метода в C# не приводит к существенным накладным расходам.
Рассмотрим тестирующую процедуру из традиционного для наших примеров класса Testing, в которой интенсивно используется вызов метода swap для различных типов переменных:
public void TestSwap(){ int x1 = 5, x2 = 7; Console.WriteLine("до обмена: x1={0}, x2={1}",x1, x2); Change.Swap<int>(ref x1, ref x2); Console.WriteLine("после обмена: x1={0}, x2={1}", x1, x2); string s1 = "Савл", s2 = "Павел"; Console.WriteLine("до обмена: s1={0}, s2={1}", s1, s2); Change.Swap<string>(ref s1, ref s2); Console.WriteLine("после обмена: s1={0}, s2={1}", s1, s2); Person pers1 = new Person("Савлов", 25, 1500); Person pers2 = new Person("Павлов", 35, 2100); Console.WriteLine("до обмена: "); pers1.PrintPerson(); pers2.PrintPerson(); Change.Swap<Person>(ref pers1, ref pers2); Console.WriteLine("после обмена:"); pers1.PrintPerson(); pers2.PrintPerson();}Обратите внимание на строки, осуществляющие вызов метода:
Change.Swap<int>(ref x1, ref x2); Change.Swap<string>(ref s1, ref s2); Change.Swap<Person>(ref pers1, ref pers2);В момент вызова метода передаются фактические аргументы и фактические типы. В данном примере в качестве фактических типов использовались встроенные типы int и string и тип Person, определенный пользователем. Общая ситуация такова: если в классе объявлен универсальный метод со списком параметров M<T1,...Tn> (...), то метод вызывается следующим образом: M<TYPE1,... TYPEn>(...), где TYPEi - это конкретные типы.
Еще раз напомню, что все эти примеры построены в Whidbey, и вот как выглядят внешний вид среды разработки и окно с результаты работы этой процедуры.
Рис. 22.1. Результаты работы универсальной процедуры swap
В этом примере использовался класс Person, и поскольку он появится и в следующих примерах, то приведу его текст:
class Person{ public Person(string name, int age, double salary) { this.name = name; this.age = age; this.salary = salary; } public string name; public int age; public double salary; public void PrintPerson() { Console.WriteLine("name= {0}, age = {1}, salary ={2}", name, age, salary); }}22. Лекция: Универсальность. Классы с родовыми параметрами
22.2 

|
|
|
Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...
История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...
Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...
© cyberpediasu.com 2017-2026 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!