На этом шаге мы рассмотрим задание нескольких ограничений.
На один и тот же параметр может накладываться несколько ограничений сразу. Подобная ситуация представлена в следующем примере.
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>();
На следующем шаге мы продолжим изучение этого вопроса.