Программисты, начинающие осваивать ООП, часто путают термины «объект» и «класс». Чтобы показать их различия, введем в пример EmployeeApp возможность рассчитывать зарплату всему штату компании.
В С-программе мы начали бы с описания массива данных о служащих компании, взяв за основу структуру Employee. Так как нам неизвестно число служащих компании в расчетный период, мы создали бы статический массив, состоящий, скажем, из 10 000 элементов. Однако когда в компании будет числиться только 1 служащий, такое использование памяти окажется весьма расточительным. Для более эффективного распределения ресурсов надо создать связанный список структур Employee и по мере необходимости динамически изменять выделение памяти.
Но это именно то, чего, по-моему, делать не следует. Мы будем ломать голову над тем, сколько памяти перераспределить и когда это лучше сделать, вместо того, чтобы сконцентрироваться на предметной области. Обращение к объектной технологии позволит нам сосредоточиться на логике решения задачи, а не на механизме ее реализации.
Есть разные трактовки термина «класс», показывающие, в частности, чем класс отличается от объекта. Считайте, что класс — это просто новый тип данных (как char, int или long), с которым связаны некие методы. Объект же — это экземпляр типа, или класса.
Реализация (instantiation) в ООП означает факт создания экземпляра (он же объект) некоторого класса. В следующем примере мы создадим только класс, или спецификацию (specification), объекта. А поскольку это не сам объект, а лишь его «чертеж», то память для него не выделяется.
Чтобы получить объект класса и начать с ним работу, мы должны объявить экземпляр класса в своем методе примерно так:
public static void Main() {
Employee emp = new Employee ("Эми", "Андерсон", 28, 100);
}
В этом примере объявлена переменная еmр типа Employee, и с помощью оператора new выполнена ее реализация. Переменная еmр представляет собой экземпляр класса Employee и является объектом Employee. Выполнив реализацию объекта, мы можем установить с ним связь через его открытые (public) члены. Например, для объекта еmр это метод CalculatePay. Пока реально объект не существует, вызывать его методы нельзя.
Взгляните на следующий код С#:
public static void Main() {
Employee emp1 = new Employee();
Employee emp2 = new Employee();
}
Здесь два экземпляра одного класса Employee — еmр1 и еmр2. Оба объекта одинаковы с точки зрения программной реализации, но у каждого экземпляра свой набор данных, который может обрабатываться отдельно от другoго. Аналогично можно создать массив или набор (collection) объектов Employee. Большинство объектно-ориентированных языков поддерживает создание и обработку массивов объектов. При этом объекты можно объединять в группы и обрабатывать в операторах цикла, вызывая методы массива этих объектов либо обращаясь к элементам массива по индексу.
C# (произносится Си-Шарп) - это новый язык программирования от компании Microsoft. Он входит в новую версию Visual Studio - Visual Studio.NET. Кроме C# в Visual Studio.NET входят Visual Basic.NET и Visual C++. Кроме того, фирма Borland объявила, что последующие версии C++ Builder и Delphi будут поддерживать платформу .NET.
Одна из причин разработки нового языка компанией Microsoft - это создание компонентно-ориентированного языка для новой платформы .NET. Другие языки были созданы до появления платформы .NET, язык же C# создавался специально под эту платформу и не несет с собой груза совместимости с предыдущими версиями языков.
Еще одна из причин разработки компанией Microsoft нового языка программирования - это создание альтернативы языку Java.
С 1995 года стал широко распространяться новый объектно-ориентированный язык программирования Java, ориентированный на сети компьютеров и, прежде всего, на Internet. Синтаксис этого языка напоминает синтаксис языка C++, однако эти языки имеют мало общего. Java интерпретируемый язык: для него определены внутреннее представление (bytecode) и интерпретатор этого представления, которые уже сейчас реализованы на большинстве платформ. Интерпретатор упрощает отладку программ, написанных на языке Java, обеспечивает их переносимость на новые платформы и адаптируемость к новым окружениям.
Как известно, реализация Java у Microsoft не была лицензионно чистой - Microsoft в присущей ей манере внесла в свою реализацию много чего от себя. Компания Sun, владелица Java, подала на Microsoft в суд, и Microsoft этот суд проиграла. Тогда Microsoft решила вообще отказаться от Java, и создать свой Java-подобный язык, который и получил название C#. Ясно, что одна из целей разработки C# - это противоборство именно с Java (недаром C# называют еще Java-killer'ом).
Создателем языка является сотрудник Microsoft Андреас Хейлсберг. Он стал известным в мире программистов задолго до того, как пришел в Microsoft. Хейлсберг входил в число ведущих разработчиков одной из самых популярных сред разработки - Delphi. В Microsoft он участвовал в создании версии Java - J++. Как отмечал сам Андреас Хейлсберг, C# создавался как язык компонентного программирования, и в этом одно из главных достоинств языка, направленное на возможность повторного использования созданных компонентов. Из других объективных факторов отметим следующие:
- C# создавался параллельно с каркасом Framework.Net и в полной мере учитывает все его возможности;
- C# является полностью объектно-ориентированным языком, где даже типы, встроенные в язык, представлены классами;
- C# является мощным объектным языком с возможностями наследования и универсализации;
- C# является наследником языков C/C++, сохраняя лучшие черты этих популярных языков программирования. Общий с этими языками синтаксис, знакомые операторы языка облегчают переход программистов от С++ к C#;
- сохранив основные черты своего великого родителя, язык стал проще и надежнее. Простота и надежность, главным образом, связаны с тем, что на C# хотя и допускаются, но не поощряются такие опасные свойства С++ как указатели, адресация, разыменование, адресная арифметика;
- благодаря каркасу Framework.Net, ставшему надстройкой над операционной системой, программисты C# получают те же преимущества работы с виртуальной машиной, что и программисты Java. Эффективность кода даже повышается, поскольку исполнительная среда CLR (Common Language Runtime) предоставляет собой компилятор промежуточного языка, в то время как виртуальная Java-машина является интерпретатором байт-кода;
- мощная библиотека каркаса поддерживает удобство построения различных типов приложений на C#, позволяя легко строить Web-службы, другие виды компонентов, достаточно просто сохранять и получать информацию из базы данных и других хранилищ данных.