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

    На этом шаге мы рассмотрим задание нескольких ограничений.

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

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

namespace pr265_1
{
    // Базовый класс: 
    class Alpha {
        // Целочисленное поле: 
        public int code;
        // Переопределение метода ToString(): 
        public override string ToString() { 
            return "Alpha: " + code;
        }
    }

    // Производный класс: 
    class Bravo: Alpha {
        // Текстовое поле: 
        public string text;
        // Переопределение метода ToString(): 
        public override string ToString() { 
            return "Bravo: " + code + " и " + text;
        }
    }

    // Обобщенный класс: 
    class MyClass<X, Y> 
        where X: class, new() // Ограничения на параметр X 
        where Y: X, new() {	// Ограничения на параметр Y
        // Первое поле обобщенного типа: 
        public X first;
        // Второе поле обобщенного типа: 
        public Y second;
        // Конструктор: 
        public MyClass() {
            // Создаются объекты обобщенных типов: 
            first = new X(); 
            second = new Y();
        }
        // Переопределение метода ToString(): 
        public override string ToString() {
            return "MyClass->|" + first + "|" + second + "|";
        }
    }

    // Главный класс: 
    class Program
    {
        // Главный метод:
        static void Main()
        {
            // Создание объекта обобщенного класса:
            MyClass<Alpha, Bravo> obj = new MyClass<Alpha, Bravo>();
            // Присваивание значений полям: 
            obj.first.code = 100; 
            obj.second.code = 200; 
            obj.second.text = "text";
            // Отображение характеристик объекта:
            Console.WriteLine(obj);
            // Задержка:
            Console.ReadLine();
        }
    }
}

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

    Ниже показано, как выглядит результат выполнения программы:


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

    В программе описан класс Alpha, который является базовым для класса Bravo. У класса Alpha есть целочисленное поле code, а в классе Bravo к нему добавляется текстовое поле text. В каждом из классов переопределен метод ToString(): методом возвращается текстовая строка с названием класса и значением полей.

    В программе также описан обобщенный класс MyClass с двумя обобщенными параметрами (обозначены как X и Y). На параметр X наложено ограничение where X: class, new(), означающее, что значением этого параметра может быть класс, у которого есть конструктор без аргументов. На параметр Y накладывается ограничение where Y: X, new(). Ограничение означает, что значением параметра Y может быть класс с конструктором без аргументов. А еще этот класс должен быть производным от класса, являющегося значением параметра X. В обобщенном классе есть поле first типа X и поле second типа Y. В конструкторе класса MyClass создаются объекты классов X и Y, и ссылки на эти объекты записываются в поля first и second. А метод ToString() для класса MyClass определен так, что отображаются название класса и текстовые представления (а значит, значения полей) объектов, на которые ссылаются поля first и second.

    В главном методе командой

  MyClass<Alpha, Bravo> obj = new MyClass<Alpha, Bravo>();
создается объект obj обобщенного класса MyClass. В качестве значения для обобщенного параметра X указан класс Alpha, а значением параметра Y указан класс Bravo (который является производным от класса Alpha). После присваивания значений полям объект obj "выводится" в консоль (в этом случае вызывается метод ToString(), описанный в классе MyClass).

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




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