В результате выполнения этой программы выводится значение 10. Дело в том, что метод ToString () возвращает строковое представление объекта, для которого он вызывается. В данном случае строковым представлением значения 10 как вызывающего объекта является само значение 10!
Класс object как универсальный тип данных
Если obj ect является базовым классом для всех остальных типов и упаковка значений простых типов происходит автоматически, то класс object можно вполне использовать в качестве 'универсального' типа данных. Для примера рассмотрим программу, в которой сначала создается массив типа object, элементам которого затем присваиваются значения различных типов данных.
// Использовать класс object для создания массива 'обобщенного' типа.
using System;
class GenericDemo { static void Main() {
object[] ga. = new object[10];
// Сохранить целые значения, for (int i=0; i < 3; i++) ga[i] = i;
ga[9] = 'Конец';
for(int i = 0; i < ga.Length; i++)
Console.WriteLine('ga[' + i + ']: ' + ga[i] + ' ');
}
}
Выполнение этой программы приводит к следующему результату.
да [ 0] : 0 да[1] : 1
да
[2] :
2
да[3] :
1.5
да [4] :
2
да[5] :
2.5
да[6] :
Привет
да
[7] :
True
да
[8] :
X
да
[9] :
Конец
Как показывает данный пример, по ссылке на объект класса object можно обращаться к данным любого типа, поскольку в переменной ссылочного типа object допускается хранить ссылку на данные всех остальных типов. Следовательно, в массиве типа object из рассматриваемого здесь примера можно сохранить данные практически любого типа. В развитие этой идеи можно было бы, например, без особого труда создать класс стека со ссылками на объекты класса object. Это позволило бы хранить в стеке данные любого типа.
Несмотря на то что универсальный характер класса object может быть довольно эффективно использован в некоторых ситуациях, было бы ошибкой думать, что с помощью этого класса стоит пытаться обойти строго соблюдаемый в C# контроль типов. Вообще говоря, целое значение следует хранить в переменной типа int, строку — в переменной ссылочного типа string и т.д.
А самое главное, что начиная с версии 2.0 для программирования на C# стали доступными подлинно обобщенные типы данных — обобщения (более подробно они рассматриваются в главе 18). Внедрение обобщений позволило без труда определять классы и алгоритмы, автоматически обрабатывающие данные разных типов, соблюдая типовую безопасность. Благодаря обобщениям отпала необходимость пользоваться классом object как универсальным типом данных при создании нового кода..Универсальный характер этого класса лучше теперь оставить для применения в особых случаях.
ГЛАВА 12 Интерфейсы, структуры и перечисления
В этой главе рассматривается одно из самых важных в C# средств:
Кроме того, в этой главе представлены еще два типа данных С#: структуры и перечисления.
Интерфейсы
Иногда в объектно-ориентированном программировании полезно определить, что именно должен делать класс, но не как он должен это делать. Примером тому может служить упоминавшийся ранее абстрактный метод.
В абстрактном методе определяются возвращаемый тип и сигнатура метода, но не предоставляется его реализация.
А в производном классе должна быть обеспечена своя собственная реализация каждого абстрактного метода, определенного в его базовом классе. Таким образом, абстрактный метод определяет
развит далее. В C# предусмотрено разделение интерфейса класса и его реализации с помощью ключевого слова interface.
