<MyRusakov.ru />

Программирование на C++ в Unreal Engine 5

Программирование на C++ в Unreal Engine 5

Данный курс научит Вас созданию игр на C++ в Unreal Engine 5. Курс состоит из 12 разделов, в которых Вас ждёт теория и практика. Причём, в качестве практики будет создан весьма крупный проект объёмом свыше 5000 строк качественного кода, который уже на практике познакомит Вас с принципами создания игр на C++ в Unreal Engine 5.

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

Помимо самого курса Вас ждёт ещё и очень ценный Бонус: «Тестирование Unreal-проектов на Python», в рамках которого Вы научитесь писать очень полезные тесты для тестирования самых разных аспектов разработки игр.

Подробнее
Подписка

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

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Модификаторы доступа в PHP

Модификаторы доступа в PHP

Модификаторы доступа - это, по сути, интерпретация инкапсуляции в ООП. Напоминаю, что инкапсуляция - это механизм сокрытия реализации объекта. Простой пример из жизни. Многие из Вас ездят в метро, и Вы сначала проходите через турникеты, прикладывая к ним специальный билет. Затем, если на Вашем билете ещё остались поездки, то турникет Вас пропускает, а если нет, то пищит и не пропускает. Вы задумывались над тем, почему так происходит? Вы задумывались над тем, как он определяет, сколько поездок ещё осталось, как он подаёт сигналы на открытие или подаёт сигнал на писк? Я думаю, что большинство из Вас даже об этом не думало. Почему? Да, потому что реализация для Вас скрыта. Всё, что Вы видите так это то, что турникет работает и всё. А как он работает Вы не знаете, и самое главное, что Вы и знать не должны. Вот это и есть пример инкапсуляции - сокрытие реализации объекта от объекта, который его использует. И для реализации инкапсуляции существуют модификаторы доступа в PHP.

В PHP имеется три модификатора доступа:

  1. Public
  2. Protected
  3. Private

Начнём с модификатора доступа public. Данный модификатор означает, что свойство, метод или конструктор будут доступны для всех объектов, которые их используют.

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

И, наконец, модификатор доступа private означает, что данный элемент объекта может быть использован только в самом объекте и нигде больше.

Давайте продолжим заниматься классами по автомобилям и реализуем их заново, но с использованием модификаторов доступа. Напоминаю, что раньше мы использовали только public, что не есть хорошо. Итак, абстрактный класс, отвечающий за "Автомобиль":

<?php
  abstract class Car {
    protected $x;
    protected $y;
    public function __construct($x, $y) {
      $this->x = $x;
      $this->y = $y;
    }
    abstract public function move ($x, $y);
    abstract protected function sound();
  }
?>

Как видите, мы сделали свойства объекта Car защищёнными (protected), то есть они теперь доступны только внутри самого класса Car, а также во всех его наследниках. Также мы закрыли служебную функцию sound(), сделав её также protected. Всё остальное (конструктор и метод move()) мы оставили открытыми, то есть public. Иногда всё-таки бывает нужно иметь доступ к свойствам, однако, делать их открытыми совсем не хочется. Тогда добавляют так называемые методы get и set:

<?php
  abstract class Car {
    protected $x;
    protected $y;
    public function __construct($x, $y) {
      $this->x = $x;
      $this->y = $y;
    }
    public function getX() {
      return $this->x;
    }
    public function getY() {
      return $this->y;
    }
    public function setX($x) {
      $this->x = $x;
    }
    public function setY($y) {
      $this->y = $y;
    }
    abstract public function move ($x, $y);
    abstract protected function sound();
  }
?>

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

Теперь класс "Auto", отвечающий за легковой автомобиль:

<?php
  require_once "car.php";
  class Auto extends Car {
    public function move($x, $y) {
      $this->sound();
      echo "Движение легкового автомобиля из координат ($this->x, $this->y) в координаты ($x, $y)<br />";
      $this->x = $x;
      $this->y = $y;
    }
    protected function sound() {
      echo "Звук движения легкового автомобиля<br />";
    }
  }
?>

Здесь мы поменяли модификатор доступа только у метода sound().

И, наконец, скрипт, который использует объект Auto.

<?php
  require_once "auto.php";
  $auto = new Auto(10, 20);
  echo $auto->getX();
  echo "<br />";
  $auto->setY(5);
  echo $auto->getY();
  echo "<br />";
  echo $auto->move(15, 15);
?>

Здесь мы создали объект Auto. Потом получили доступ к его свойству X (напоминаю, что модификатор доступа стоит protected, поэтому писать так нельзя: $auto->x; - будет ошибка). Затем меняем значение свойства Y на 5. А после вызываем метод движения. Вы можете всё проверить и убедиться, что всё работает как швейцарские часы.

Таким образом, мы с Вами привели код нашей программы к наилучшему варианту. Возможно, Вы спросите: "А где использовать модификатор доступа private?". Используйте его всегда, если у Вашего объекта не будет наследников. Главное, чтобы Вы понимали чётко: служебные методы (то есть методы, которые не будут использоваться за пределами класса) - в private (или protected), а методы, которые будут использоваться за пределами класса, необходимо пометить как public. Что касается конструктора, то Вы можете его пометить как private, если не хотите, чтобы можно было создать объект (такое часто бывает нужно, например, при реализации шаблона Singleton, когда от одного класса может быть создан лишь один объект на всю программу, впрочем, это уже другая история). А со свойствами поступайте так: если свойство используется за пределами класса очень часто, то делайте его public, если не используется вообще, то private (или protected). Если свойство используется, но достаточно редко, то сделайте его private (или protected), но также реализуйте методы get и set. Вот и всё.

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

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

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

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

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (21):

ArturPanteleev ArturPanteleev 06.07.2012 16:10:25

Создавал класс для страницы, и в нем получилось много полей(титл, дескрипшн, тело и т.д) хотел написать функцию которая бы в качестве параметра получала нужный элемент страницы и получала его, так как эта идея показалась мне гораздо более разумной чем писать гет методы для каждого поля. Сейчас покажу что я делал: public function get_something($param) { return $this->$param; } конечно же функция не сработала(из за того что после -> стоит знак $) вопрос такой, возможно ли вообще реализовать то что я хочу(то есть get метод для произвольного поля класса) средствами php?

Ответить

Admin Admin 06.07.2012 16:14:34

Сразу в поля записать то, что в GET не получится. Но можно вручную это сделать. То есть принять массив и сразу его значения раскидать по полям. А уже потом обычными методами вытаскивать эти значения из полей.

Ответить

ArturPanteleev ArturPanteleev 06.07.2012 16:21:53

Ясно, а если делать для каждого поля свой метод, это не сильно скажется на быстродействии?

Ответить

Admin Admin 06.07.2012 17:28:39

На быстродействие это практически не повлияет.

Ответить

ppk-center ppk-center 22.09.2012 21:58:28

<?php require_once "car.php"; class Auto extends Car { public function move($x, $y) { $this->sound(); echo "Движение легкового автомобиля из координат ($this->x, $this->y) в координаты ($x, $y)<br />"; $this->x = $x; $this->y = $y; } protected function sound() { echo "Звук движения легкового автомобиля<br />"; } } ?> У вас не закрашен!

Ответить

Admin Admin 24.09.2012 11:57:39

Спасибо, исправил!

Ответить

rollender rollender 13.04.2013 17:55:11

Михаил, Вы написали "В PHP имеются три модификаторы доступа". Может быть, Вы имели в виду "три модификатора доступа"?

Ответить

Admin Admin 13.04.2013 21:14:29

Спасибо, исправил!

Ответить

kumakbtu kumakbtu 04.05.2013 15:03:53

В php есть default modificator как на Jave?

Ответить

Admin Admin 04.05.2013 21:20:00

Да, это public.

Ответить

lev_100rus lev_100rus 26.07.2013 01:16:38

У вас ошибка тут "Начнём с модификаторы доступа public"

Ответить

Admin Admin 26.07.2013 19:27:58

Спасибо, исправлено.

Ответить

andrew11 andrew11 06.10.2013 18:17:27

Михаил, а зачем вообще нужно скрывать код ?

Ответить

Admin Admin 06.10.2013 20:37:44

Для реализации механизма инкапсуляции.

Ответить

andrew11 andrew11 07.10.2013 14:06:28

Ну а инкапсуляция зачем нужна ?

Ответить

Admin Admin 07.10.2013 21:51:03

Тут написано: http://myrusakov.ru/oop-javascript.html

Ответить

apola apola 12.03.2018 14:45:42

123

Ответить

apola apola 12.03.2018 14:50:01

123

Ответить

apola apola 12.03.2018 14:54:20

<img class="avatar" src="/images/avatars/user_1.jpeg" alt="Admin">

Ответить

apola apola 12.03.2018 14:57:19

<script type="text/javascript"> alert(111); </script>

Ответить

apola apola 12.03.2018 14:57:51

<<script type="text/javascript"> alert(111); </script>

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.