ООП для “чайников”. Наследование, инкапсуляция, полиморфизм – три кита объектного ориентирования.

Три кита объектного ориентирования это: наследование, инкапсуляция и полиморфизм. Без четкого понимания этих вещей программисту тяжело написать хороший объектно-ориентированный код, использовать всю силу этого подхода, а главное устроится на хорошую работу.
В прошлый раз я рассказывал о классах, объектах, свойствах и методах, если с этими понятиями проблем не возникает, дальше тоже всё будет очень просто. Для наглядности я буду приводить короткие куски кода на PHP (на самом деле язык тут не важен, просто мне кажется это самый распространенный на сегодня синтаксис, хоть и более классическим для примеров ООП является java, мне кажется PHP будет более полезным), поясняющие идею, и давать короткие описания.

class Animal {
	function draw() {
		return "just animal";
	}

	function eat() {
		return "the animal is eating";
	}
}

class Cow extends Animal {
	function draw() {
		Return "something that looks like a cow";
	}
}

Как видите здесь Корова (Cow) унаследовала функционал от Животного (Animal), изменив реализацию метода draw (конкретизируя как корова на самом деле выглядит), и оставив реализацию метода eat(). Это и есть наследование. Теперь инкапсуляция. Сам по себе этот термин означает «сокрытие». Инкапсуляция, это способ сделать невозможным изменения критичных для работы класса свойств или вызова внутренних методов. Например у нас есть требование: каждое животное должно иметь кличку, и кличка, в течении его жизни не должна меняться. Самое правильное в таком случае это принимать кличку в качестве параметра конструктора (метода выполняемого при создании класса), и хранить его во внутреннем, сокрытом свойстве. Например так:

сlass Animal {
	
	private $name;
	
	function __construct($name) {
		$this->name = $name;
	}
	
	function getName() {
		return $this->name;
	}	
	
	...
	
}

Вот это и есть инкапсуляция. Нет способа изменить кличку снаружи класса, и вы можете быть уверены, что в любом случае, кличка у экземпляра класса будет именно та, что была задана при создании. Ну а теперь полиморфизм. Это тут тоже начнем с примера. Добавим класс Sheep (овца).

class Sheep extends Animal {

	function draw() {
		return 'something that looks like a sheep';
	}		
	
}

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

$animal = rand(0,1) ? new Cow('burenka') : new Sheep('kudryashka');
echo $animal->draw();

Данный пример будет случайным образом генерировать экземпляр Коровы и Овцы, и рисовать их.
Нужно сказать что данный пример не совсем «чистый» полиморфизм. Дело в том что полиморфизм подразумевает собой реализацию одного и того же интерфейса в разных классах. Объясню: если бы мы не реализовали метод draw() в одном из классов, у нас переодически возникала бы ошибка обращения к несуществующему методу, а в языках со строгой типизицией, ошибка бы возникала еще на стадии компиляции. Чтобы избежать подобных казусов, нужно использовать итерфейсы (interface):

interface IDrawable {
	
	function draw();
	
}

class Cow extends Animal implements IDrawable {

	function draw() {
		return 'something that looks like a cow';
	}		
	
}

class Sheep extends Animal implements IDrawable {

	function draw() {
		return 'something that looks like a sheep';
	}		
	
}

Как только вы указали, что класс должен реализовывать интерфейс, компилятор или интерпретатор берет на себя обязательство проконтролировать что в классе реализованы методы, описанные в интерфейсе, что позволяет отлавливать ошибки еще до запуска приложения. Вот собственно и всё.

Comments

comments

14 comments On ООП для “чайников”. Наследование, инкапсуляция, полиморфизм – три кита объектного ориентирования.

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

    ———
    Дело в том что полиморфизм подразумевает собой реализацию одного и того же интерфейса в разных классах.
    ———-

    Ну очень понятная фраза для чайников :)))) Откуда оно знает, что имеется в виду под интерфейсом. Программный интерфейс, API-интерфейс или implements ISomething? :))))

  • Согласен. Готов рассмотреть любые версии по упрощению языка.

  • Кристина

    Да уж. Предыдущая запись про собак и кошек с присвоением имени и отчества хозяину была написана как-то понятнее…)

  • Кристина

    но все же это лучше, чем Колин Мук на совершенно неподготовленную насквозь гуманитарную почву)

  • ————-
    Согласен. Готов рассмотреть любые версии по упрощению языка.
    ————-
    Я хоть не мегаавторитет, но могу посоветовать отрешиться от какого бы то ни было конкретного языка и попытаться объяснить “на пальцах” и показать “на кошках”. Зверски трудно, но и результат, по идее, должен быть понятней даже какому-нить проджект менеджеру :))))))

  • Я просто только вот написал нечто подобное (по ссылке на нике в разделе “теория”). только у меня одна статья про одно свойство ООП занимает, как у вас про все три. Уж не знаю, недостаток это, или наоборот, не стоит пытаться столь трудное для понимания неподготовленным умом быстро описать.

  • иностранец

    Спасибо автору!
    Теперь все понятно!

  • Денис

    Большое спасибо автору! Все очень доходчиго объясняется.

  • Спасибо!! благодаря автору сдал зачет по программированию :)

  • Не так ясно как с собаками и кошками при объяснении класса и элземпляра класса. Но все же большое спасибо автору за его труд.

  • Про полиморфизм так и не понял совсем, инкапсуляцию – частично. Но нигде пока более понятное объяснение не нашел.

  • Я считаю, что писать надо в правильной терминологии, даже если это для чайников, пусть чайник развивается))

  • Михаил

    Здравствуйте.
    Вопрос про инкапсуляцию. Правильно ли я понимаю, что если кличка “private”, то при создании объекта она будет наследоваться без изменений?

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

Leave a reply:

Site Footer

Sliding Sidebar

About Me

About Me

Для кого этот блог?

Для тех кого интересуют современные интернет технологи, IT бизнес, стартапы, менеджмент, контроль качества, личная эффективность, мотивация. Здесь я буду писать о том, что в первую очередь будет интересно мне, о проблемах и решениях. О том что пригодилось мне, и возможно будет интересно Вам.

Что заставило меня создать его?

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

Немного о себе.

Мой первый серьезный опыт в IT это работа над desktop приложениями в компании «Эксперт-Софт». У истоков её стояли несколько амбициозных и талантливых молодых людей, с огнем в глазах и желанием работать «как майкрософт». То чем мы там занимались вполне могли бы сегодня назвать «стартапом». Рук было откровенно мало, поэтому приходилось заниматься всем: кодированием на Delphi, написанием скриптов на VBA, дизайном, вёрсткой и поддержкой вебсайта, работой над рекламной полиграфией, проектированием интерфейсов и БД. Работы было много, но запал был велик, команда очень разношерстная, гармонично дополняя друг-друга в решении нетривиальных задач. Благодаря тому что пришлось попробовать многое, постепенно вырисовалось понимание того чем хочется заниматься, и как. Софтверным программированием я был сыт по горло. Массы проблем десктопного софта в вебе просто не было, по определению. Зато был четкий фокус на дизайне, юзабилити, скорости. Поэтому когда пришла пора уходить из «Эксперт-Софт», я без всякого сожаления стал искать работу как разработчик для web. Поскольку городишко у нас не очень большой, выбор был практически предопределен. Так я стал работать в «Оникс-Системз», где и продолжаю работать поныне. За время работы в компании я как разработчик принимал участие в работе над несколькими десятками проектов. Несколько десятков проектов было сделано мною как фрилансером. Самым большим проектом в котором я сыграл роль менеджера, считаю свою семью. Также довольно большой проект мы сейчас поднимаем с командой разработчиков (на данный момент команда состоит из четырех php разработчиков, одного flex кодера и тестировщика). Отсюда, большой интерес к современным практикам и методологиям, разным подходам в управлении командой, повышению эффективности и качества работы. По мере сил, вдохновения и свободного времени, я буду писать об этом.

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

e-mail:
skype: denis.sheremetov
Старый сайт, с музычкой и флешом

Прочая онлайновая деятельность: