Шаг 266.
Язык программирования C#. Начала.
Обобщенные типы. Ограничения на параметры типа (и еще продолжение)

    На этом шаге мы рассмотрим задание ограничений на обобщенные параметры в интерфейсах.

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr266_1
{
    // Обобщенный интерфейс с ограничением 
    // на обобщенный параметр: 
    interface MyInterface<T> 
        where T: struct{ void show(); }
    // Обобщенный класс реализует обобщенный интерфейс: 
    class MyClass<T>: MyInterface<T> 
        where T: struct {
        // Поле обобщенного типа: 
        public T val;
        // Конструктор: 
        public MyClass(T v) { 
            val = v;
        }
        // Описание метода из интерфейса: 
        public void show() {
            Console.WriteLine("Tип {0}: значение {1}", typeof(T).Name, val);
        }
    }

    // Главный класс: 
    class Program
    {
        static void Main()
        {
            // Создание объектов на основе обобщенного класса:
            MyClass<int> A = new MyClass<int>(100);
            MyClass<char> B = new MyClass<char>('B');
            // Вызов метода из объектов:
            A.show();
            B.show();
            // Задержка:
            Console.ReadLine();
        }
    }
}

Архив проекта можно взять здесь.

    При выполнении программы получаем следующий результат:


Рис.1. Результат работы приложения

    Обобщенный интерфейс MyInterface описан с обобщенным параметром T, на который накладывается ограничение where T: struct. Ограничение означает, что обобщенный параметр T может "скрывать" за собой нессылочный тип. В интерфейсе объявлен метод show() без аргументов, не возвращающий результат.

    Обобщенный класс MyClass реализует интерфейс MyInterface. Ограничение на обобщенный параметр в классе указано такое же, как и в интерфейсе. В классе описано поле val обобщенного типа. Значение поля отображается при вызове метода show(). Также отображается значение обобщенного параметра.


Значение полю val присваивается в конструкторе. Напрямую здесь ограничение, накладываемое на обобщенный параметр, не используется, хотя это и имеет значение: при присваивании значения полю val в него копируется значение аргумента (то есть копируется значение, а не выполняется ссылка на уже существующий объект).

    В главном методе создаются объекты A и B класса MyClass. Значение полю val объектов присваивается при создании объектов. Для проверки значений полей из объектов вызывается метод show().

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг