Шаг 269.
Язык программирования C#. Начала.
Обобщенные типы. Примеры использования
На этом шаге мы рассмотрим несколько примеров решения задач, в которых используются обобщенные типы.
Здесь мы рассмотрим несколько программ, в которых используются рассмотренная на предыдущих шагах обработка исключений.
Задание 1.
Напишите программу, содержащую обобщенный класс со свойством обобщенного типа. Значением свойства возвращается значение
закрытого поля обобщенного типа. При присваивании значения свойству значение присваивается закрытому полю.
Раскрыть/скрыть решение и комментарии.
Решение задачи может быть следующим.
Создаем закрытое поле обобщенного типа perem. Для работы с этим полем реализуем свойство обобщенного типа code, которое используется
для доступа к закрытому полю.
Приведем текст приложения.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace pr269_1
{
// Обобщенный класс c одним параметром:
class Alpha<X>
{
// Закрытое поле обобщенного типа:
private X perem;
// Конструктор:
public Alpha(X a)
{
perem = a;
}
// Описание свойства обобщенного типа:
public X code
{
// Метод вызывается при считывании значения свойства:
get
{
// Значение свойства:
return perem;
}
// Метод вызывается при присваивании
// значения свойству:
set
{
perem = value;
}
}
}
class Program
{
static void Main()
{
// Создание объектов обобщенного класса:
Alpha<int> A = new Alpha<int>(123);
Alpha<string> B = new Alpha<string>("object B");
Alpha<char> C = new Alpha<char>('C');
Console.WriteLine("Начальные значения, полученные через свойство
обобщенного типа:");
Console.WriteLine("A.code = " + A.code);
Console.WriteLine("B.code = " + B.code);
Console.WriteLine("C.code = " + C.code);
A.code = 55;
B.code = "Строка";
C.code = '#';
Console.WriteLine("Значения, после изменения через свойство обобщенного типа:");
Console.WriteLine("A.code = " + A.code);
Console.WriteLine("B.code = " + B.code);
Console.WriteLine("C.code = " + C.code);
// Задержка:
Console.ReadLine();
}
}
}
Архив проекта можно взять
здесь.
Результат работы приложения может быть таким:
Рис.1. Результат работы приложения
Задание 2.
Напишите программу, в которой есть статический обобщенный метод. Аргументом методу передается массив из элементов обобщенного типа. Результатом метод
возвращает значение наибольшего элемента в массиве. Чтобы можно было сравнивать значения обобщенного типа, на этот обобщенный тип следует наложить
ограничение: тип должен быть таким, что реализует интерфейс
IComparable. Если так, то для сравнения значений может использоваться метод
CompareTo(). Метод вызывается из одного объекта (первый объект) обобщенного типа, а аргументом ему передается другой (второй) объект
обобщенного типа (сравниваемые объекты). Результатом метода является целое число. Отрицательное число возвращается, если первый объект "меньше" второго. Положительное число возвращается, если первый объект "больше" второго.
Если объекты равны друг другу, то результатом метода
CompareTo() является нулевое значение.
Раскрыть/скрыть решение и комментарии.
Прблема при решении этой задачи заключается в задании ограничения на аргумент обощенного вида: where T: IComparable<T>. Указанное ограничение
говорит о том, что можно сравнивать объекты типа T, используя метод CompareTo(). Как он работает, описано в условии задачи.
Приведем текст приложения:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace pr269_2
{
class Program
{
// Обобщенный метод (с аргументом обобщенного типа):
static T max<T>(T[] arg)
// Органичение на аргумент обобщенного типа.
// Интерфейс IComparable<T> позволяет сравнить
// объекты типа T:
where T: IComparable <T>
{
// Выбираем максимальный элемент:
T val = arg[0]; // Начальное значение максимума
for (int k = 1; k < arg.Length; k++)
{
// Сравниваем два элемента.
// Если текущий элемент больше максимального,
// меняем максимальный элемент:
if (val.CompareTo(arg[k]) < 0) val = arg[k];
}
return val;
}
static void Main()
{
// Создаем массивы с элементами различных типов:
string[] A = { "one", "two", "three" };
int[] B = { 2, 3, 5, 8, 13, 21 };
char[] C = { 'c', 'h', 'a', 'r', 'l', 'i' };
// Вызываем обобщенный метод с массивами
// различных видов:
string s = max<string>(A);
int a = max<int>(B);
char ch = max<char>(C);
// Вывод результатов:
Console.WriteLine("max(A) = {0}, max(B) = {1}, max(C) = {2}", s, a, ch);
// Задержка:
Console.ReadLine();
}
}
}
Архив проекта можно взять
здесь.
Результат работы приложения изображен на рисунке 2.
Рис.2. Результат работы приложения
Надеемся, что приведенный текст программы не вызвал затруднений.
Задание 3.
Напишите программу, в которой есть обобщенный класс. У обобщенного класса есть поле, являющееся ссылкой на массив из элементов
обобщенного типа. Опишите для класса операторный метод для оператора +, позволяющий вычислять сумму двух объектов класса.
Результатом является объект этого же класса. Массив в объекте-результате получается объединением массивов суммируемых объектов.
Раскрыть/скрыть решение и комментарии.
Текст этой программы несложный. Надеемся, что приведенных комментариев будет достаточно для понимания работы приложения.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace pr269_3
{
// Обобщенный класс c одним параметром:
class MyClass<X>
{
// Поле обобщенного типа:
private X[] mas; // Массив
private int n; // Количество элементов массива
// Конструктор:
public MyClass(X[] t)
{
n = t.Length;
mas = t;
}
// Операторный метод для перегрузки оператора сложения:
public static MyClass<X> operator+(MyClass<X> a, MyClass<X> b)
{
// Размер массива:
int m = a.mas.Length + b.mas.Length;
X[] arg = new X[m]; // Создание массива
// Заполнение массива:
for (int i = 0; i < m; i++)
{
if (i < a.mas.Length)
arg[i] = a.mas[i];
else
arg[i] = b.mas[i - a.mas.Length];
}
// Результат метода: экземплар класса
return new MyClass<X>(arg);
}
// Метод, выводящий элементы массива:
public void show()
{
string txt = "|";
for (int i = 0; i < mas.Length; i++)
txt += mas[i] + "|";
Console.WriteLine("Поле типа {0}: {1}", typeof(X).Name, txt);
}
}
class Program
{
static void Main()
{
// Создание числовых массивов:
int[] a1 = { 3, 5, 17 };
int[] a2 = { 9, 7 };
// Объекты обобщенного класса:
MyClass< int> A1 = new MyClass< int>(a1);
MyClass <int >A2 = new MyClass< int>(a2);
// Сложили объекты обобщенного класса:
MyClass< int> A3 = A1 + A2;
// Вывод результатов:
A1.show();
A2.show();
A3.show();
// Создание символьных массивов:
char[] ch1 = { 'a', 'b' };
char[] ch2 = { 'x', 'y', 'z' };
// Объекты обобщенного класса:
MyClass<char> CH1 = new MyClass<char>(ch1);
MyClass<char> CH2 = new MyClass<char>(ch2);
// Сложили объекты обобщенного класса:
MyClass<char> CH3 = CH2 + CH1;
// Вывод результатов:
CH1.show();
CH2.show();
CH3.show();
// Задержка:
Console.ReadLine();
}
}
}
Архив проекта можно взять
здесь.
Результат работы приложения приведен на рисунке 3.
Рис.3. Результат работы приложения
Со следующего шага мы начнем знакомиться с созданием приложений с графическим интерфейсом.
Предыдущий шаг
Содержание
Следующий шаг