Лабораторная работа №9. Классы

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

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

Классы - это особое “изобретение” программистов для упрощения разработки сложных программ и улучшения их качества. В основе классов лежат три фундаментальных принципа, которые называются инкапсуляция, наследование и полиморфизм.

Инкапсуляция

Класс представляет собой единство трех сущностей - полей, методов и свойств. Объединение этих сущностей в единое целое и называется инкапсуляцией. Инкапсуляция позволяет во многом изолировать класс от остальных частей программы, сделать его “самодостаточным” для решения конкретной задачи. В результате класс всегда несет в себе некоторую функциональность. Инкапсуляция представляет собой мощное средство обмена готовыми к работе программными заготовками.

Наследование

Любой класс может быть порожден от другого класса. Для этого при его объявлении указывается имя класса-родителя:

Порожденный класс автоматически наследует поля, методы и свойства своего родителя и может дополнять их новыми. Таким образом, принцип наследования обеспечивает поэтапное создание сложных классов и разработку собственных библиотек классов.

Полиморфизм

Полиморфизм - это свойство классов решать схожие по смыслу проблемы разными способами. Поведенческие свойства класса определяются набором входящих в него методов. Изменяя алгоритм того или иного метода в потомках класса, программист может придавать этим потомкам отсутствующие у родителя специфические свойства. Для изменения метода необходимо перекрыть его в потомке, т. е. объявить в потомке одноименный метод и реализовать в нем нужные действия. В результате в объекте-родителе и объекте-потомке будут действовать два одноименных метода, имеющих разную алгоритмическую основу и, следовательно, придающих объектам разные свойства. Это и называется полиморфизмом объектов.

Составляющие класса

Поля

Полями называются инкапсулированные в классе данные. Поля могут быть любого типа, в том числе – классами.

Класс-потомок получает все поля всех своих предков и может дополнять их своими, но он не может переопределять их или удалять.

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

Методы

Инкапсулированные в классе процедуры и функции называются методами. Они объявляются так же, как и обычные подпрограммы:

Доступ к методам класса, как и к его полям, возможен с помощью составных имен:

Классы и обьекты

Класс является основой для создания объектов. В классе определяются данные и код, который работает с этими данными. Объекты являются экземплярами класса.

Методы и переменные, составляющие класс, называются членами класса. При определении класса объявляются данные, которые он содержит, и код, работающий с этими данными. Данные содержатся в переменных экземпляра, которые определены классом, а код содержится в методах. В С# определены несколько специфических разновидностей членов класса. Это — переменные экземпляра, статические переменные, константы, методы, конструкторы, деструкторы, индексаторы, события, операторы и свойства.

Непосредственно инициализация переменных в объекте (переменных экземпляра) происходит в конструкторе. В классе могут быть определены несколько конструкторов.

Синтаксис класса: class имя класса{ тип доступа тип имя переменной 1; тип доступа тип имя переменной2;

тип доступа возвращаемый тип

имя метода1 (список параметров) { тело метода}

}

где тип_доступа может быть public, private, protected, internal. Члены класса с типом доступа public доступны везде за пределами данного класса, с типом доступа protected - внутри членов данного класса и производных, с типом доступа private - только для других членов данного класса. Тип доступа internal применяется для типов, доступных в пределах одной сборки.

Пример:

class Animal{

public string Name; private int Weight;

protected int Type;

public int Animal(int W, int T, string N){ Weight=W; Type=T; Name=N;

}

public int GetWeight(){return Weight;}

}

Создание объекта

имя класса имя объекта = new имя класса ();

При создании обьекта класса происходит вызов соответствующего конструктора класса.

Конструктор и деструктор

Конструктор класса - метод для инициализации объекта при его создании. Он имеет то же имя, что и его класс. В конструкторах тип возвращаемого значения не указывается явно. Конструкторы используются для присваивания начальных значений переменным экземпляра, определенным классом, и для выполнения любых других процедур инициализации, необходимых для создания объекта.

Все классы имеют конструкторы независимо от того, определен он или нет. По умолчанию в С# предусмотрено наличие конструктора, который присваивает нулевые значения всем переменным экземпляра (для переменных обычных типов) и значения null (для переменных ссылочного типа). Но если конструктор явно определен в классе, то конструктор по умолчанию использоваться не будет.

имя класса (список параметров) {тело конструктора}

Деструктор - метод, вызывающийся автоматически при уничтожении обьетка класса (непосредственно перед "сборкой мусора"). Деструктор не имеет параметров и возвращаемого значения.

~имя_класса() {тело_деструктора} Наследование

Наследование — это свойство, с помощью которого один объект может приобретать свойства другого. При этом поддерживается концепция иерархической классификации, имеющей направление сверху вниз. Используя наследование, объект должен определить только те качества, которые делают его уникальным в пределах своего класса. Он может наследовать общие атрибуты от своих родительских классов.

Синтаксис:

class имя класса: имя родительского класса { тело класса}

Пример:

class Predator:Animal{ private int Speed;

}

С помощью наследования создается иерархия классов (отношение ' являться'). Кроме того, можно построить еще одну структуру - иерархию объектов (тогда, когда один объект является частью другого - отношение ' часть-целое').

Полиморфизм

Полиморфизм - одна из основных составляющих объектно-ориентированного программирования, позволяющая определять в наследуемом классе методы, которые будут общими для всех наследующих классов, при этом наследующий класс может определять специфическую реализацию некоторых или всех этих методов. Главный принцип полиморфизма: «один интерфейс, несколько методов». Благодаря ему, можно пользоваться методами, не обладая точными знаниями о типе объектов.

Основным инструментом для реализации принципа полиморфизма является использование виртуальных методы и абстрактных классов.

Виртуальные методы

Метод, при определении которого в наследуемом классе было указано ключевое слово virtual, и который был переопределен в одном или более наследующих классах, называется виртуальным методом. Следовательно, каждый наследующий класс может иметь собственную версию виртуального метода.

Выбор версии виртуального метода, которую требуется вызвать, осуществляется в соответствии с типом объекта, на который ссылается ссылочная переменная, во время выполнения программы. Другими словами, именно тип объекта, на который указывает ссылка (а не тип ссылочной переменной), определяет вызываемую версию виртуального метода. Таким образом, если класс содержит виртуальный метод и от этого класса были наследованы другие классы, в которых определены свои версии метода, при ссылке переменной типа наследуемого класса на различные типы объектов вызываются различные версии виртуального метода.

При определении виртуального метода в составе наследуемого класса перед типом возвращаемого значения указывается ключевое слово virtual, а при переопределении виртуального метода в наследующем классе используется модификатор override. Виртуальный метод не может быть определен с модификатором static или abstract.

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

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

Синтаксис:

virtual тип имя (список параметров){тело метода}; Пример:

Абстрактные классы

В абстрактном классе определяются лишь общие предназначения методов, которые должны быть реализованы в наследующих классах, но сам по себе этот класс не реализует один, или несколько подобных методов, называемых абстрактными (для них определены только некоторые характеристики, такие как тип возвращаемого значения, имя и список параметров).

При объявлении абстрактного метода используется модификатор abstract. Абстрактный метод автоматически становится виртуальным, так что модификатор virtual при объявлении метода не используется.

Абстрактный класс предназначен только для создания иерархии классов, нельзя создать объект абстрактного класса.

Пример:

abstract class Animal

{

public string Name; protected int Weight; private int Type; abstract void Feed();

public int Animal(int W, int T, string N)

{

Weight=W;

Type=T;

Name=N;

}

public int GetWeight(){return Weight;}

}

class Predator:Animal

{

private int Speed;

override void Feed(int Food){

Weight += Food;}

}

Задания к лабораторной работе 9:

1. Изучить предлагаемую теорию.

2. Записать и откомпилировать программу, использующую графический интерфейс с конструктором и деструктором собственного класса.

3. Выполнить домашние задания (тема 13), согласно номеру варианта.


Список рекомендуемой литературы

  1. Вилле К. Представляем Си Шарп. ДМК Пресс, 2001.
  2. Петцольд Ч. Программирование для Microsoft Windows на C#. «Русская
  3. редакция», 2002.
  4. Робинсон У. C# без лишних слов. ДМК Пресс, 2002.
  5. Шилдт Г. С#, учебный курс. Питер, 2003.
  6. Troelsen A. C# and the.NET platform (2nd ed.).- APress, 2003, 1200 p.p.
  7. https://msdn.microsoft.com/ru-ru/ms348103.aspx

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: