Объектно-ориентированное программирование

Автор работы: Пользователь скрыл имя, 12 Декабря 2014 в 15:28, доклад

Описание работы

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

Файлы: 1 файл

пример использования класов.docx

— 42.13 Кб (Скачать файл)

 

 

Объектно-ориентированное программирование

 

В языке С# все программы и данные представляют собой объекты, а все обрабатывающие их алгоритмы являются методами. Оба этих понятия имеют самое непосредственное отношение к ООП.

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

 

Первые шаги к ООП

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

Возьмем, например, обычный телевизор. Ниже мы перечислили некоторые параметры, которые могут характеризовать телевизор как объект:

  • марка телевизора;
  • название компании-изготовителя;
  • габаритные размеры;
  • вес;
  • количество принимаемых каналов;
  • возможность работы с пультом дистанционного управления;
  • наличие выхода для подключения видеомагнитофона.

Если телевизор включен, то приобретают значение и другие параметры, например:

  • номер принимаемого канала;
  • громкость звука;
  • стандарт видеосигнала (PAL, SEC AM, NTSC).

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

  • включение электропитания;
  • отключение электропитания;
  • включение канала с заданным номером с панели телевизора;
  • включение канала с заданным номером с пульта дистанционного управления;
  • увеличение громкости;
  • уменьшение громкости;
  • временное отключение звука во время рекламных вставок;
  • включение звука после временного отключения.

Возможность использования тех или иных методов работы с телевизором зависит от его характеристик, а также от текущего состояния. Например, если телевизор не может работать с пультом дистанционного управления, вы не сможете использовать часть методов, например включение канала с помощью пульта. Если телевизор выключен, его нельзя выключить еще раз, так как эта операция не имеет никакого смысла. Если телевизор в состоянии принимать только 6 каналов, никаким образом не удастся включить канал с номером 40 и т. д. Таким образом, возможность и способы выполнения тех или иных операций с телевизором определяются его характеристиками и текущим состоянием, т. е. данными о телевизоре.

 

Программная модель телевизора

 

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

 

Данные

Характеристики и текущее состояние телевизора мы будем хранить в наборе переменных различных типов. Ниже мы перечислили эти переменные и привели их краткое описание:

bool isPowerOn; // включен  или выключен 

byte maxChannel; // максимальный  номер канала 

byte currentChannel; // текущий  номер канала 

byte currentVolume; // текущая  громкость звука 

В переменной isPowerOn типа bool мы будем хранить состояние выключателя электропитания телевизора. Если телевизор включен, в переменной isPowerOn будет находиться значение true, а если выключен — значение false. Максимальное количество каналов, принимаемых телевизором, будет храниться в переменной maxChannel, а номер текущего канала, принимаемого в настоящий момент времени, — в переменной currentChannel. Кроме того, в переменной currentVolume мы будем хранить уровень громкости, выражаемый в процентах. При этом, если звук выключен, уровень громкости будет равен 0 %, а если включен на максимальную громкость — 100 %.

 

Методы

Наша модель телевизора сможет выполнять несколько операций. Это операция инициализации, включения и выключения телевизора, операции установки номера принимаемого канала и уровня громкости, а также определение состояния телевизора (включен или выключен), определение текущего номера канала и текущего уровня громкости.

Для выполнения перечисленных операций в нашей программной модели

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

Вот, например, как выглядит метод, включающий электропитание телевизора:

void SetPowerStateOn()

{

isPowerOn = true;

}

Ключевое слово void означает, что метод не возвращает никакого значения.

Мы считаем, что включение телевизора обязательно заканчивается успехом (хотя на практике это не всегда так), поэтому результат выполнения данной операции нас не интересует. После ключевого слова void идет название метода SetPowerStateOn. Мы выбрали его произвольно, однако с тем условием, чтобы это название отражало действие, выполняемое методом. Далее в фигурных скобках располагаются операторы метода. Включение

телевизора сводится к записи в переменную isPowerOn значения true. Пока мы отвлечемся от способа определения этой переменной и будем считать, что методы имеют доступ ко всем переменным, описывающим состояние нашего виртуального телевизора. Чтобы выключить телевизор, мы определили метод SetPowerStateOf f:

void SetPowerStateOff()

{

isPowerOn = false;

}

Выключение телевизора сводится к записи в переменную isPowerOn значения false. Чтобы определить, включен или выключен обычный телевизор, нам достаточно взглянуть на его экран. Для определения состояния виртуального телевизора придется создать несколько методов.

Метод GetPowerState позволяет получить текущее значение, хранящееся в пе-

переменной isPowerOn:

bool GetPowerState()

{

return isPowerOn;

}

Обратите внимание, что объявление метода начинается с ключевого слова bool. Это означает, что метод должен вернуть логическое значение типа bool. Для возвращения значения используется оператор return. В данном случае этот оператор возвращает значение переменной isPowerOn. Если телевизор включен, метод GetPowerState возвратит значение true, в противном случае — значение false. Итак, мы научились включать и выключать телевизор. Теперь займемся каналами.

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

bool SetChannel(byte channel)

{

if(channel <= maxChannel && channel > 0)

{

currentChannel = channel;

return true;

}

else

return false;

}

В качестве параметра этому методу передается номер канала channel. Метод проверяет номер канала и, если он больше нуля и не превышает максимально допустимого, записывает новый номер канала в переменную currentChannel. При успешном переключении канала метод SetChannel возвращает значение true, а в случае ошибки — значение false. Это значение можно использовать для выявления ошибочной попытки установить недопустимый номер канала. В дальнейшем мы расскажем вам о более совершенном методе обработки ошибок, основанном на обработке исключений.

Получить номер текущего канала можно с помощью метода GetChannel:

byte GetChannel()

{

return currentChannel;

}

Этот метод просто возвращает текущее содержимое переменной current-

Channel. Для управления громкостью  мы предусмотрели метод SetVolume:

void SetVolume{byte volume)

{

if(volume > 0 && volume <= 100)

currentVolume = volume;

else

currentVolume = 0;

}

Он устанавливает новый уровень громкости, записывая значение volume в переменную currentVolume. Перед этим, однако, наш метод проверяет, находится ли новое значение громкости в диапазоне от 0 до 100 %. Если задан неправильный уровень громкости, звук выключается. Получить текущий уровень громкости можно с помощью метода GetVolume:

byte GetVolume()

{

return currentVolume;

)

Он просто возвращает текущее значение уровня громкости, хранящееся в переменной currentVolume. В завершение мы определим метод, выполняющий инициализацию всех переменных:

TelevisionSet()

{

// Устанавливаем  исходное состояние телевизора 

isPowerOn = false; // выключен 

maxChannel = 40; // всего  можно смотреть 4 0 каналов 

currentChannel = 1; // при  включении показывать канал 1

currentVolume = 10; // громкость  при включении - 10%

}

Сразу после создания объекта (виртуального телевизора) этот метод выключает электропитание телевизора, определяет максимальное количество каналов 40), устанавливает текущий номер канала, равный единице, а также задает начальный уровень громкости — 10 % от максимального уровня. Мы намеренно не снабдили этот метод ключевым словом void, хотя он и не возвращает никаких значений. Об этом, а также о выборе имени для метода инициализации мы поговорим в следующем разделе.

 

Объединяем все вместе.

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

class <Имя класса>

{

[<Поле класса 1>]

[<Поле класса 2>]

[<Поле класса N>]

[<Конструктор>]

[<Метод класса 1>]

[<Метод класса 2>]

[<Метод класса  М>]

}

После ключевого слова class идет название класса. Например, для нашего телевизора мы выберем название класса TelevisionSet:

class TelevisionSet

{

}

 Объявление полей и методов класса находится внутри блока операторов, ограниченного фигурными скобками. Вы можете размещать поля и методы внутри этого блока в произвольном порядке, однако предпочтительнее придерживаться какой-либо стратегии. Мы, например, размещаем внутри объявления класса вначале поля класса, а потом методы, но можно поступить и наоборот. Вот сокращенный пример объявления класса TelevisionSet (полный пример будет рассмотрен позже):

class TelevisionSet

{

// включен или  выключен 

// максимальный  номер канала 

// текущий номер  канала 

// текущая громкость  звука

 

public TelevisionSet()

{

isPowerOn = false; // выключен 

maxChannel =40; // всего  можно смотреть 40 каналов 

currentChannel =1; // при  включении показывать канал 1

currentVolume =10; // громкость  при включении - 10%

}

 

public void SetPowerStateOn{)

{

isPowerOn = true;

}

 

public void SetPowerStateOff()

{

isPowerOn = false;

}

 

 

}

 

Как видите, в верхней части объявления класса находятся переменные isPowerOn, maxChannel, currentChannel и currentVolume, описанные нами ранее и отражающие текущее состояние телевизора. В контексте определения класса эти переменные обычно и называют полями класса. Поле maxChannel снабжено так называемым классификатором доступа public, о котором мы расскажем позже. Ниже полей объявлен метод, имя которого совпадает с именем нашего класса, — TelevisionSet:

public TelevisionSet(byte numberOfChannels)

{

isPowerOn = false; // выключен

maxChannel = numberOfChannels; // макс, количество каналов

currentChannel= 1; // при  включении показывать канал 1

currentVolume =10; // громкость  при включении - 10%

}

Метод с таким именем называется конструктором класса. На конструктор класса возлагается задача инициализации полей класса, поэтому мы поместили сюда несколько операторов, определяющих начальное состояние телевизора. Мы передаем конструктору один параметр numberOfChannels, определяющий максимальное количество телевизионных каналов, которое способен показывать наш телевизор. По определению конструктор не может возвращать никакого значения. В отличие от других методов класса в конструкторе не допускается использование ключевого слова void для обозначения этого обстоятельства. Классификатор доступа public определяет один из видов доступа к полю класса или методу. Здесь оно разрешает вызов конструктора из внешней программы. Управление доступом к полям и методам класса мы рассмотрим позже во всех подробностях. Сейчас вы должны запомнить, что если в классе определен метод-конструктор, то он вызывается при создании объекта, описанного данным классом, с целью его инициализации. Вслед за конструктором мы разместили в классе несколько описанных ранее методов, снабдив их ключевым словом public.

Информация о работе Объектно-ориентированное программирование