среда, 8 апреля 2009 г.

Классы, их наследование и объекты "на пальцах"

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

Итак, что же такое классы и их наследники и чем они отличаются от объектов.

Возьмём, к примеру, класс Стол. Этот класс обладает свойствами: Длина, Ширина, Высота. И имеет метод, например: Стоять.
У класса Стол есть наследники (дочерние классы). Например, класс ПисьменныйСтол и КомпьютерныйСтол. Эти классы наследуют от родительского класса Стол все его свойства (Длина, Ширина, Высота) и методы (Стоять), но класс ПисьменныйСтол, по мимо унаследованных от родительского класса Стол свойств и методов, может иметь дополнительное своство КоличествоЯщиков и метод ВыдвинутьЯщик. Также и класс КомпьютерныйСтол может иметь свойство КоличествоСекцийДляCD и метод ВыдвинутьСтолешницу.
Стол
, КомпьютерныйСтол и ПисьменныйСтол -- это классы.
Почему?
Потому что это некоторые сущности, которые описывают некий набор свойств и поведений характерных для всех столов (класс Стол) или только для компьютерных столов (класс КомпьютерныйСтол) или только для письменных столов (класс ПисьменныйСтол).
Но тогда что же такое объект?
Объект -- это стол за которым ты сейчас сидишь (причём скорее всего это объект класса КомпьютерныйСтол). Объект -- это (в большинстве случаев) экземпляр некоторого класса. Также как твой компьютерный стол является экземпляром класса КомпьютерныйСтол.

Перенося всё это в PHP код получим:

<?php

/**
* Стол
*/
class Table {
/**
* Длина стола
* @var float
*/
public Length;

/**
* Ширина стола
* @var float
*/
public Width;

/**
* Высота стола
* @var float
*/
public Height;

/**
* Осуществляет стояние стола
*/
public function Stand() {

}
}

/**
* КомпьютерныйСтол
*/
class ComputerTable extends Table {
/**
* Количество секций для CD
* @var int
*/
public CDSectionsCount;

/**
* Выдвигает столешницу с клавиатурой
*/
public function MoveOutTabletop() {

}
}

/**
* ПисьменныйСтол
*/
class Desk extends Table {
/**
* Количество ящиков
* @var int
*/
public DeskDrawerCount

/**
* Выдвигает ящик с указанным номером
* @param int $DeskDrawerNumber Номер выдвигаемого ящика
*/
public function MoveOutDeskDrawer($DeskDrawerNumber) {

}
}

$MyTable = new Table(); // а вот $MyTable -- это уже объект класса Table
$MyTable->Width = 1;
$MyTable->Height = 0.7;
$MyTable->Length = 3;

$MyComputerTable = new ComputerTable(); // $MyComputerTable -- тоже объект
$MyComputerTable->Width = 0.8; // и так как класс ComputerTable является
$MyComputerTable->Height = 0.7; // наследником класса Table, то он имеет
$MyComputerTable->Length = 0.5; // все теже свойства что и объект $MyTable
$MyComputerTable->CDSectionsCount = 5; // плюс новое свойство CDSectionsCount

$MyComputerTable->Stand(); // Аналогично свойствам наследуются и методы
$MyComputerTable->MoveOutTabletop();

?>


P.S.: PHP -- не лучший выбор для начала освоениея ООП, но сейчас я пишу в основном на нём.

Комментариев нет:

Отправить комментарий