Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

1.6.3Параметры типа

В определении класса может задаваться набор параметров типа. Список имен параметров типа указывается за именем класса в угловых скобках. Параметры типа могут использоваться в теле объявлений класса для определения членов класса. В следующем примере для класса Pair задаются параметры типа TFirst и TSecond:

public class Pair<TFirst,TSecond> { public TFirst First;

public TSecond Second; }

Тип класса, в объявлении которого принимаются параметры типа, называется универсальным типом класса. Типы структуры, интерфейса и делегата также могут быть универсальными.

При использовании универсального класса для каждого параметра типа необходимо указать аргумент типа:

Pair<int,string> pair = new Pair<int,string> { First = 1, Second = “two” }; int i = pair.First; // TFirst is int string s = pair.Second; // TSecond is string

Универсальный тип с предоставленными аргументами типа, например Pair<int,string>, называется сформированным типом.

1.6.4Базовые классы

В объявлении класса может задаваться базовый класс, имя которого записывается после имени класса и параметров типа через двоеточие. Класс, для которого не задан базовый класс, считается производным от типа object. В следующем примере для класса Point3D базовым является Point, а базовым классом для Point является object:

public class Point { public int x, y;

public Point(int x, int y) { this.x = x; this.y = y; } }

public class Point3D: Point { public int z;

public Point3D(int x, int y, int z): base(x, y) { this.z = z; } }

Класс наследует члены своего базового класса. Наследование означает, что класс неявно содержит все члены его базового класса, исключая конструкторы экземпляров и статические конструкторы, а также деструкторы базового класса. Производный класс может добавлять новые члены к своим унаследованным членам, но он не может удалить определение унаследованного члена. В предыдущем примере класс Point3D наследует поля x и y класса Point. Это означает, что каждый экземпляр класса Point3D содержит три поля: x, y и z.

Существует неявное преобразование из типа класса к любому из его базовых типов класса. Таким образом, переменная типа класса может ссылаться на экземпляр этого класса или любого производного от него класса. Например, если сделаны предыдущие объявления классов, переменная типа Point может ссылаться как на экземпляр класса Point, так и на экземпляр класса Point3D:

Point a = new Point(10, 20); Point b = new Point3D(10, 20, 30);

1.6.5Поля

Поле представляет собой переменную, связанную с классом или экземпляром класса.

Поле, объявленное с использованием модификатора static, определяет статическое поле. Статическое поле определяет только одно место хранения. Вне зависимости от количества создаваемых экземпляров класса всегда существует только одна копия статического поля.

Поле, объявленное без использования модификатора static, определяет поле экземпляра. Каждый экземпляр класса содержит отдельную копию всех полей экземпляра класса.

В следующем примере каждый экземпляр класса Color содержит отдельную копию полей экземпляра r, g и b. Однако существует только одна копия статических полей Black, White, Red, Green и Blue:

public class Color { public static readonly Color Black = new Color(0, 0, 0); public static readonly Color White = new Color(255, 255, 255); public static readonly Color Red = new Color(255, 0, 0); public static readonly Color Green = new Color(0, 255, 0); public static readonly Color Blue = new Color(0, 0, 255);

private byte r, g, b;

public Color(byte r, byte g, byte b) { this.r = r; this.g = g; this.b = b; } }

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]