Опубликован: 27.07.2006 | Уровень: для всех | Доступ: платный
Лекция 9:

Модели и программирование

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

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

Практически все современные языки программирования, независимо от принадлежности к тому или иному стилю (директивному или декларативному), поддерживают концепцию ООП. Среди них C++, Java, Ruby и Haskell. Существуют и версии объектно-ориентированного Пролога.

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

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

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


Классы собак, кошек и утконосов являются дочерними по отношению к классу млекопитающих, следовательно наследуют его свойства. При программной реализации этой иерархии логично метод "кормление детенышей" реализовывать в родительском классе, вместо того, чтобы несколько раз дублировать его в каждом из подклассов. Наследование свойств родительского класса позволяет использовать их в дочерних классах. Немного другая ситуация с рождением детенышей, ведь утконосы откладывают яйца, а не являются живородящими животными? В этой ситуации выручает свойство полиформизма: различные реализации методов могут носить одинаковые имена, а система сама определит какую из реализаций использовать в том или ином случае. В нашем примере следует в классе млекопитающих реализовать метод "потомство" (родить детеныша), в классах собак и кошек этот метод будет отсутствовать (система будет искать его в родительском классе и найдет его там), а в классе утконосов нужно написать новый метод, с тем же именем, но другой реализацией (отложить яйца).

Итак, в основе ООП лежат три основных понятия:

  • инкапсуляция (сокрытие данных в классе или методе);
  • наследование;
  • полиморфизм.

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

Наследование - это процесс, в результате которого один тип наследует свойства другого типа.

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

Пример

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

Поместите в файл с именем life.rb фрагмент кода, расположенный ниже.

#!/usr/bin/ruby

class Animal
   def breath #Дыхание
     print "все животные дышат: вдохнули и выдохнули\n" 
   end
end

class Cat<Animal
   def bark # Подать голос
      print "Mew Mew, я кошка. \n"
   end
end

class Dog
    def bark # Подать голос
      print "Bow Wow, я собака. \n"
    end
end

class Bird
   def lay_egg
     print "Яйцо снесено\n"
   end
   def fly
     print "Я птица, я лечу!!!\n"
   end
end

class Penguin<Bird
   def fly
      print "Пингвины не летают!!!\n"
   end
 end

# Создаем объекты разных классов
pochi = Dog.new
pochi.bark

tama = Cat.new
tama.breath
tama.bark

macaw  = Bird.new
macaw.lay_egg
macaw.fly

penguin  = Penguin.new
penguin.lay_egg
penguin.fly

(скачать файл life.rb )

Для запуска этой программы выполните в окне shell команду

ruby life.rb

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

Задания

  1. Создайте еще одну кошку.
  2. Объясните, кем является pochi и сможет ли он выполнить команду pochi.breath (дышать)? Если нет, то внесите соответствующие изменения в текст программы.
  3. Измените код программы так, чтобы и птицы в ней тоже умели дышать.
Дмитрий Фаттахов
Дмитрий Фаттахов
Виктория Бельгесова
Виктория Бельгесова

Добрый день. Как получить удостоверение о прохождении данного курса?

Николай Серков
Николай Серков
Россия, г. Санкт-Петербург
Елена Сочнева
Елена Сочнева
Россия