Ооп для начинающих урок 10 полиморфизм

инкапсуляция .

ТВОЯ ГЛАВНАЯ ОШИБКА В ООП

Нажми для просмотра

Обсуждаем
главную
ошибку
новичков в
ООП на
собеседова
ниях, а
именно
инкапсуляц
ию, узнаем
чем
сокрытие…
 
 
 
Тэги:
 
Инкапсуляция данных в ООП

Нажми для просмотра

Что такое
инкапсуляц
ия в
объектно-о
иентирова
ном
программир
овании и
зачем она
нужна.
 
 
 
Тэги:
 
Новичкам об Инкапсуляции и ООП.

Нажми для просмотра

Telegram: VK:
Инста:
 
 
 
Тэги:
 
Инкапсуляция

Нажми для просмотра

Инкапсуляц
ия — это
одно из
основных
понятий
Объектно
Ориентиров
анного
Программир
ования.
Причина
прос…
 
 
 
Тэги:
 
Инкапсуляция ООП пример. private методы. Что такое инкапсуляция. C++ Для начинающих. Урок#77

Нажми для просмотра

Понравилос
ь видео или
оказалось
полезным?
Подпишись!
нкапсуляц
я ООП
пример.
private
методы. Что
такое
инкапс…
 
 
 
Тэги:
 
Что такое инкапсуляция? Заблуждения об инкапсуляции

Нажми для просмотра

00:03 Вопрос
о
инкапсуляц
ии на
собеседова
нии 00:32
Пример
инкапсуляц
ии в Java 01:28
Что такое
инкапсуляц
ия
 
 
 
Тэги:
 
Урок по Java 12: Инкапсуляция

Нажми для просмотра

Мой второй
канал на
английском
— Мои курсы
на
юдеми: …
 
 
 
Тэги:
 
JAVA — ООП — Про три заветных слова — Инкапсуляция, Наследование, Полиморфизм

Нажми для просмотра

На этой
видеолекци
и я
предоставл
ю свой
взгляд на
ООП — что
это такое,
зачем это
нужно и как
этим
пользовать
ся.
 
 
 
Тэги:
 
03. Модель OSI Часть 3-я: Инкапсуляция

Нажми для просмотра

Сетевые
технологии
OSI Модель OSI
Обучение
Сети и
коммуникац
ии
Локальные
сети
Уровни OSI 7
уровней
Семь
уровней…
 
 
 
Тэги:
 
Научись программировать на Go(Golang) #5 ООП, Инкапсуляция

Нажми для просмотра

В этом
видео мы
научимся
создавать
объявления
объектов и
сами
объекты 2мя
способами,
а так же
создание
мето…
 
 
 
Тэги:
 
Инкапсуляция

Нажми для просмотра

Инкапсуляц
ия в
ООППрактик
а: ]]Александ

Программис
т,
Преподават
ель …
 
 
 
Тэги:
 
Модель OSI. Инкапсуляция. Сетевые стандарты.

Нажми для просмотра

Сегодня
говорим
подробнее
о моделе OSI,
разбираем
примеры
адресации
в СПД,
изучаем
процесс
инкапсуляц
ии,…
 
 
 
Тэги:
 
Что такое ООП (объектно-ориентированное программирование)?

Нажми для просмотра

Рассказыва
ю, что
такое
объектно-о
иентирова
ное
программир
ование, а
то часто
спрашивают
Курсы JAVA —
 
 
 
Тэги:
 
Как правильно читать Технические книги

Нажми для просмотра

Разминочны
й видос
после
отдыха.
Учимся
читать
техническу
ю
литературу
и книги по
программир
ованию в
частно…
 
 
 
Тэги:
 
Что нужно знать Junior C# разработчику?

Нажми для просмотра

В этом
подкасте
мы
поговорим
о том какие
знания
нужны
кандидату
на
должность
Junior C#
разработчи
ка ▻ ▻ ▻…
 
 
 
Тэги:
 
Признаки слабого программиста

Нажми для просмотра

Поступить
в
онлайн-уни
ерситет
для
программис
тов
Привет, в
этом видео
мы узнаем
как
работает…
 
 
 
Тэги:
 
Как работает игровой движок // Рендеринг

Нажми для просмотра

Чем на
самом деле
заняты
программис
ты на
работе,
отличается
ли
загрузка у
более и
менее
опытных
разработчи
к…
 
 
 
Тэги:
 
Что на работе делает Junior, Middle, Senior Dev.?

Нажми для просмотра

soer #влог
#влогпрогр
ммиста Чат
для
программис
тов —
Спонсорска
я помощь …
 
 
 
Тэги:
 
Что нужно знать про ООП

Нажми для просмотра

В данном
видео я
покажу
зачем
нужен
паттерн
фабричный
метод. И
объясню
как
паттерн
фабричный
метод
влияет…
 
 
 
Тэги:
 
Паттерн Фабричный Метод

Нажми для просмотра

Здесь вы
познакомит
есь с одним
из
мощнейших
механизмов
ООП,
полиморфиз
мом, а
также с
поздним
(динамичес
им)…
 
 
 
Тэги:
 
Полиморфизм в ООП

Нажми для просмотра

В этом
видео,
узнаем
зачем
нужен
полиморфиз
м в ООП и
почему он
самый
главный,
крутой и
четкий
Ссылочки:
 
 
 
Тэги:
 
Ё*кий полиморфизм

Нажми для просмотра

В этом
видео
рассмотрим
один из
принципов
ООП —
инкапсуляц
ию.
Исходники:
 
 
 
Тэги:
 
OO ABAP урок 02 — Инкапсуляция

Нажми для просмотра

Тема: Что
такое
инкапсуляц
ия? Автор
текущего
мувера:
Полный
список тем
для
муверов
вы …
 
 
 
Тэги:
 
Что такое инкапсуляция?

Нажми для просмотра

Урок на
сайте itProger:
В этом
уроке мы
разберем
основные
моменты
ООП в языке
Python, а …
 
 
 
Тэги:
 
Уроки Python для начинающих | #18 — Наследование, инкапсуляция, полиморфизм

Нажми для просмотра

Описание
четырех
принципов
ООП:
1.Абстракци
я
2.Инкапсуля
ция
3.Наследова
ние
4.Полиморфи
зм.
 
 
 
Тэги:
 
3.1 — принципы ООП. Абстракция, наследование, полиморфизм, инкапсуляция

Нажми для просмотра

МОЙ НОВЫЙ
КУРС:
Реклама и
сотрудниче
ство: @.
 
 
 
Тэги:
 
Java для начинающих. Урок 18: Инкапсуляция. Сеттеры и геттеры.

Нажми для просмотра

Пройди
БЕСПЛАТНО
профориент
ацию в IT —
Подробный
разбор
двух
основных
принципов
ООП …
 
 
 
Тэги:
 
Основы C# — #3 — Наследование и Инкапсуляция

Нажми для просмотра

Я
рассказыва
ю о
проблеме,
которую
решает
инкапсуляц
ия. Все
встреченны
е мной
источники
описывают
внешню…
 
 
 
Тэги:
 
Инкапсуляция в ООП» rel=»spf-prefetch

Нажми для просмотра

Описание отсутсвует
 
 
 
Тэги:
 
06 Python Intermediate Принципы ООП Инкапсуляция» rel=»spf-prefetch

Определение

Я программист и мне совершенно непонятно что такое инкапсуляция по версии нашей википедии. В англоязычной всё намного понятнее. Предлагаю просто перевести:

— A language mechanism for restricting access to some of the object’s components.
— A language construct that facilitates the bundling of data with the methods (or other functions) operating on that data

— Языковой механизм ограничения доступа к определённым компонентам объекта
— Языковая конструкция, облегчающая объединение данных с методами (или другими функциями), работающими с этими данными.

Второе мне не совсем понятно, но там же идёт разъяснение, что чаще под инкапсуляцией подразумевают только первое.

А у нас «Инкапсуля́ция — свойство языка программирования, позволяющее пользователю не задумываться…» — ну честное слово, дальше даже задумываться не хочется.

178.49.207.146 09:45, 21 февраля 2012 (UTC) Dima

Поддерживаю вас. — Эта реплика добавлена с IP 81.18.136.202 (о)

@Arachnelis: в текущей версии в преамбуле говорится одно, а в первом разделе («Подробности») — другое. В первом разделе приводятся два значения (при этом это перевод определения английского раздела), а в преамбуле инкапсуляция определяется исключительно вторым способом. — Джек, который построил дом (обс.) 14:13, 11 января 2017 (UTC)

Также, заменив определение, вы сильно размыли его. Если я возьму набор случайных данных и соединю его с набором случайных функций, я ещё не совершу инкапсуляцию. Сравни: «языковая конструкция, позволяющая связать данные с методами, предназначенными для обработки этих данных». — Джек, который построил дом (обс.) 14:17, 11 января 2017 (UTC)

А, увидел у вас топик-бан, пардон. — Джек, который построил дом (обс.) 14:21, 11 января 2017 (UTC)

Странное определение, абсолютно не способствующее пониманию: «упаковка данных и функций в единый компонент». Если я напихаю данных и функций в массив какой-то это не будет инкапсуляцией. И при чём тут упаковка? Попробую переписать. Dron007 (обс.) 03:11, 2 ноября 2019 (UTC)

Переписал на такое: «в информатике размещение в одном компоненте данных и методов, которые с ними работают. Также может означать скрытие внутренней реализации от других компонентов. Например, доступ к скрытой переменной может предоставляться не напрямую, а с помощью методов для чтения (геттер) и изменения (сеттер) её значения.» Мне кажется, намного лучше. Апологетов «несокрытия» также должно удовлетворить. Но, главное, дает сразу интуитивное понимание термина тем, кто имеет опыт программирования. Без всяких заумных усложнений. Программирование практическая наука. Убрал в другой части отсыл на какие-то более точные формализированные описания, которых всё равно нет. Давайте попроще и поближе к народу быть. Энциклопедия должна пояснять, а не давать определения, непонятные даже тем, кто более 20 лет программирует. Разумеется, не за счёт потери смысла. Dron007 (обс.) 03:46, 2 ноября 2019 (UTC)

Причины начала инкапсуляции

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

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

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

Самый тривиальный пример инкапсуляции, который сохранился с давних пор и актуален по сей день. Три переменных «фамилия», «имя», «отчество», где бы они не находились, всегда требуют к себе функций добавления, изменения, удаления. Более того, эти переменные обеспечивают массу конкретных людей, то есть массу экземпляров:

  • Иванов, Иван, Иванович;
  • Петрова, Ирина, Васильевна;
  • Кукушкина, Полина, Григорьевна;
  • … и абстрактный класс …
  • «фамилия», «имя», «отчество»;
  • … и три вечные функции …
  • добавить;
  • изменить;
  • удалить.

Таких конструкций на любом уровне (адреса, рабочие должности, штатное расписание, производственный план) можно придумать великое множество. И сложность реализации иной конструкции будет неимоверно длительной.

Примеры

Ada

Основная статья: Ада (язык программирования)

package Stacks is
  
  type Stack_Type is private;
  
  procedure Push (Stack : in out Stack_Type; Val : Integer);
  
private

  type Stack_Data is array (1 .. 100) of Integer;
  
  type Stack_Type is record
    Max : Integer := 0.3;
    Data : Stack_Data;
  end record;
end Stacks;

C++

Основная статья: C++

class A
{
 public:
   int a, b; //данные открытого интерфейса
   int ReturnSomething(); //метод открытого интерфейса
 private:
   int Aa, Ab; //скрытые данные
   void Do_Something(); //скрытый метод
};

Класс А инкапсулирует свойства Aa, Ab и метод Do_Something(), представляя внешний интерфейс ReturnSomething, a, b.

C#

Основная статья: C sharp

Целью инкапсуляции является обеспечение согласованности внутреннего состояния объекта. В C# для инкапсуляции используются публичные свойства и методы объекта. Переменные, за редким исключением, не должны быть публично доступными. Проиллюстрировать инкапсуляцию можно на простом примере. Допустим, нам необходимо хранить вещественное значение и его строковое представление (например, для того, чтобы не производить каждый раз конвертацию в случае частого использования). Пример реализации без инкапсуляции таков:

    class NoEncapsulation
    {
        public double ValueDouble;
        public string ValueString;
    }

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

    class EncapsulationExample
    {
        private double valueDouble;
        private string valueString;

        public double ValueDouble
        {
            get { return valueDouble; }
            set 
            {
                valueDouble = value;
                valueString = value.ToString();
            }
        }

        public string ValueString
        {
            get { return valueString; }
            set 
            {
                double tmp_value = Convert.ToDouble(value); //здесь может возникнуть исключение
                valueDouble = tmp_value;
                valueString = value;
            }
        }
    }

Здесь доступ к переменным valueDouble и valueString возможен только через свойства ValueDouble и ValueString. Если мы попытаемся присвоить свойству ValueString некорректную строку и возникнет исключение в момент конвертации, то внутренние переменные останутся в прежнем, согласованном состоянии, поскольку исключение вызывает выход из процедуры.

Delphi

Основная статья: Delphi (язык программирования)

В Delphi для создания скрытых полей или методов их достаточно объявить в секции .

  TMyClass = class
  private
    FMyField: Integer;
    procedure SetMyField(const Value: Integer);
    function GetMyField: Integer;
  public
    property MyField: Integer read GetMyField write SetMyField;
  end;

Для создания интерфейса доступа к скрытым полям в Delphi введены свойства.

PHP5

Основная статья: PHP5

class A
{
 private $a; // скрытое свойство
 private $b; // скрытое свойство
 private function DoSomething() //скрытый метод
 {  
  //actions
 }

 public function ReturnSomething() //открытый интерфейс
 { 
  //actions
 }
};

В этом примере закрыты свойства $a и $b для класса A с целью предотвращения повреждения этих свойств другим кодом, которому необходимо предоставить только права на чтение.

Java

Основная статья: Java

class A {
 private int a;
 private int b;

 private void doSomething() { //скрытый метод
  //actions
 }

 public int getSomething() { //открытый метод
  return a;
 } 
}

JavaScript

Основная статья: JavaScript

var A = function() {
 // private
 var _property;
 var _privateMethod = function() { /* actions */ } // скрытый метод

 // public
 this.getProperty = function() { // открытый интерфейс
  return _property;
 }

 this.setProperty = function(value) { // открытый интерфейс
  _property = value;
  _privateMethod();
 }
}

или

var A = function() {
 // private
 var _property;
 var _privateMethod = function() { /* actions */ } // скрытый метод

 // public
 return {
  getProperty: function() { // открытый интерфейс
   return _property;
  },
  setProperty: function(value) { // открытый интерфейс
   _property = value;
   _privateMethod();
  }
 }
}

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

Существуют такие модификаторы доступа, которыми, в числе прочих, способна манипуляривать инкапсуляция (программирование Java):

  • public («паблик» — публичный, открытый, доступ) — общий доступ как для текущих объектов и классов, так и для внешнего мира;
  • private («прайват» — приватный, частный, скрытый доступ) — закрытый доступ, суть которого полностью противоположна предыдущему. Обеспечивает доступ только из текущего класса;
  • protected («протектед» — защищенный, полускрытый, доступ) — доступ для текущего класса и производных от него;
  • по умолчанию — неуказанный модификатор доступа подразумевает, что поле/метод видно для всего текущего пакета классов.

В языке C# («Си Шарп»), помимо указанных (исключая последний), есть еще такие модификаторы:

  • internal («интернал» — внутренний доступ) — общедоступность в текущем сборе, закрытый доступ по всем остальным случаям;
  • internal protected («интернал протектед» — внутренний защищенный доступ) — объединение двух модификаторов в один, в котором проявляются свойства обоих из них.

Начало ООП

«Надо срочно что-то менять», – подумало некоторое количество разработчиков, и в качестве хорошего примера предложило поработать с объектами на Turbo Pascal 6.0 Professional. Это не идеальное предложение, но очень качественное простое и эффективное.

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

Звучит сложно. Положив, что инкапсуляция данных – это простое объединение данных и кода, все очень упрощается и появляется отличная концепция.

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

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

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

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

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

Абстракция

Преимущества:

  • Применяя абстракцию, мы можем отделить то, что может быть сгруппировано по какому-либо типу.
  • Часто изменяемые свойства и методы могут быть сгруппированы в отдельный тип, таким образом основной тип не будет подвергаться изменениям. Это усиливает принцип ООП: «Код должен быть открытым для Расширения, но закрытым для Изменений».
  • Абстракция упрощает представление доменных моделей.

Отличие между абстракцией и инкапсуляциейЧто такое абстрактный класс и абстрактный метод?Когда необходимо использовать абстрактный класс?Что такое интерфейс?

  1. Множественное наследование.
  2. Слабая связанность. Происходит абстракция операции, такая как разделение на уровни, а конкретной реализацией может быть что угодно: JDBC, JPA, JTA и т.д.
  3. Программа-интерфейс не реализуется.
  4. Полиморфизм с динамическим связыванием: раскрывается програмный интерфейс объекта без раскрытия его фактической реализации.
  5. Абстрактные уровни, разделение функциональностей.

Разница между интерфейсом и абстрактным классом.

  • Интерфейс — это договорные отношения с классами, которые этот интерфейс реализуют, о том, что реализация происходит путём, обозначенным интерфейсом. Это пустая оболочка с объявленными методами.
  • Абстрактный класс определяет некоторое общее поведение и просит свои подклассы определить нетипичное или конкретное поведение для своего класса.
  • Методы и члены абстрактного класса могут быть обозначены любым модификатором доступа, в свою очередь все методы интерфейса обязаны быть открытыми (public).
  • Когда происходит наследование абстрактного класса, класс-наследник должен определить абстрактные методы, в то время как интерфейс может наследовать другой интерфейс и при этом не обязательно определять его методы.
  • Класс-наследник может расширять только один абстрактный класс, а интерфейс может расширять или класс может реализовывать множество других интерфейсов.
  • Класс-наследник может определять абстрактные методы с тем же или менее ограниченным модификатором доступа, при этом класс, реализующий интерфейс, должен определять методы с тем же уровнем видимости.
  • Интерфейс не содержит конструкторы, в том время, как они есть в абстрактном классе.
  • Переменные, объявленные в Java-интерфейсе по умолчанию являются final. Абстрактный класс может содержать переменные, которые не являются final.
  • Все участники Java-интерфейса по умолчанию являются . Участники абстрактного класса могут позволить себе быть , и др.

4 ответа

4

Не увязнув в семантическую дискуссию о точном определении ООП, я бы сказал, что если вы используете полиморфизм, то (как вы заметили) вы используете основное преимущество ООП.

Использование классов типов или утиная печать действительно является еще одним способом достижения той же цели. Вы не используете стиль наследуемого объекта C ++ /Java, но вы все еще разрабатываете концепцию типизированных объектов. На мой взгляд, это либо другой стиль OOP (отличный от унаследованного стиля C ++), либо что-то настолько близкое к ООП, что он только номинально отличается.

Помимо полиморфизма, что настолько привлекательно для ООП стиля С ++? Просто стиль C ++, если вам это нравится.

4

Помимо полиморфизма наследования и подтипа, вот список с большими вещами об объектно-ориентированной парадигме:

  • Инкапсуляция — сохранение скрытых данных и внутренней структуры обеспечивает большую гибкость при их изменении.
  • Модуляция. Большинство объектно-ориентированных языков основаны на классах, что делает модульность более естественной; также каждый модуль должен взаимодействовать с другими модулями через четко определенные интерфейсы.
  • Разделение проблем — каждый модуль /класс должен делать одно; и легче определить, что он делает.
  • Легкость моделирования — объекты домена естественно могут быть смоделированы в объекты
  • Обработка исключений — хотя это и не является особенностью ООП, она связана главным образом с языками OO.
  • Повторяемость — парадигма OO принесла рамки, которые являются отличным способом повторного использования кода.
  • Целесообразность создания крупных проектов. В принципе, объектно-ориентированная парадигма — единственный возможный способ, с помощью которого мы можем легко построить большую систему.

Большое преимущество ООП над другими — идея модуляции; здесь у вас есть много модулей, которые общаются друг с другом, отправляя сообщения между ними. Это большое улучшение по сравнению с старым способом программирования, когда у вас были данные, и многие подпрограммы меняли одни и те же данные.

3

Как человек, который никогда не был особенно влюблен в ООП, я могу подумать о нескольких причинах, чтобы использовать его.

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

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

Я не знаю, будет ли это то, что вы назвали бы «неотразимым», но, с другой стороны, я бы также сказал, что ad hoc-полиморфизм почти так же чрезмерен, как и раньше. Оба набора языковых функций — это инструменты, которые могут или не могут быть особенно полезны в данном контексте. Кроме того, они часто полезны в сочетании; нет никакого смысла вести себя так, как будто это соревнование между ними.

Помимо уже полученных ответов, я хотел бы предложить следующие преимущества:

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

Я уверен, что есть много причин, но вы заметите, что эти причины не сильно отличаются от того, что вы уже сказали, «потому что это популярно».

Да, вам придется в какой-то мере использовать его, но то, что я, кажется, читаю, — это то, что вам не интересно, и что вы не чувствуете себя вынужденным работать с ООП за пределами своей профессиональной деятельности или, по крайней мере, не является движущей силой. Поэтому, чтобы ответить на ваш вопрос вопросом, почему бы вам не найти что-то, что еще больше волнует вас в программировании?

Я так же узнал о ООП после того, как был так взволнован, когда начал с C ++ (waaay back when when …). Мне стало скучно, и я терял свою мысль. Я все еще использую ООП ежедневно в своей профессиональной работе, но я нашел большое волнение в изучении новых вещей, таких как функциональное программирование (Haskell), например. Это новое для меня и захватывающее, и я снова ощущаю новое. Глупо? Возможно, но это принесло некоторое удовольствие тому, что я делаю снова. Возможно, это тот ответ, который вы ищете.

Инкапсуляция на конкретном примере

Инкапсуляция (программирование) пример:

* Примечание:

description — это описание метода/свойства/переменной, то есть комментирование того, что, собственно, происходит в программе. Продемонстрировано при помощи открывающихся/закрывающихся тегов

using System;

namespace OOPLibrary.Auto

{

///

/// Данный класс предназначен для того, чтобы описывать свойства и действия автомобиля

///

public class Auto

{

///

/// Переменная, созданная для того, чтобы в нее записывать, сколько автомобилю лет, так как внешнее вмешательство в это свойство разработчик считает лишним

/// оно помечается модификатором private, то есть закрытый, частный доступ (см. описание выше).

///

private int _age;

///

/// Булевская переменная (только два возможных значения — либо да, либо нет), которая описывает, движется ли автомобиль на данный момент

/// Она также не должна быть открыта для конечного пользователя, кем бы он ни был. Потому и этой переменной присваивается закрытый модификатор доступа «прайват»

///

private bool _isMoving;

///

/// В данной строковой переменной должна содержаться информация о цвете автомобиля. Он может подвергаться изменениям со стороны внешнего воздействия

/// потому для Цвета выбран модификатор открытого доступа «паблик».

///

public string Color;

///

/// В данном конкретном случае допускаем, что имя автомобиля тоже можно менять

/// присваивается модификатор паблик (открытый доступ для всех, вне зависимости от класса или сборки).

///

public string Name;

///

/// Открывается конструктор класса и все свойства, выраженные переменными и заданные чуть ранее, получают свои значения

///

public Auto()

{

_age = 5;

_isMoving = false;

Color = «Фиолетовый»;

Name = «Шкода Октавиа»;

}

///

/// Метод реализует возврат значения возраста авто. Зачем это необходимо?

/// закрытый модификатор доступа не делает его возможным для изменения клиентом.

///

/// Возвращает возраст автомобиля.

public string GetAge()

{

return «На данный момент выбранной машине» + _age + » лет.»;

}

///

/// Если автомобиль не движется, этот метод реализует старт движения. Выполняется проверка переменной, обознающей, в каком состоянии находится автомобиль (едет он или нет), и, в зависимости от результатов, выполняется соответствующее действие/выводится соответствующее сообщение.

///

public void Start()

{

if (_isMoving)

{

Console.WriteLine(«Движение уже было начато»);

}

else

{

_isMoving = true;

Console.WriteLine(«На старт, внимание.. Вперед! Поехали!»);. }

}

}

///

/// Если движение было начато, то этот метод его останавливает. Та же программная логика, что и в предыдущем рассмотренном случае.

///

public void Stop()

{

if (_isMoving)

{

_isMoving = false;

Console.WriteLine(«Стоп, машина»);

}

else

{

Console.WriteLine(«Ошибка. Автомобиль и так стоит на месте, не движется»);

}

}

///

/// Осуществляется поворот налево, если имеет место движения автомобиля

///

public void MoveLeft()

{

if (_isMoving)

{

Console.WriteLine(«Осуществлен поворот налево»);

}

else

{

Console.WriteLine(«Ошибка. Автомобиль стоит на месте. Функция поворота на данный момент недоступна»);

}

}

///

/// Аналогичный метод с поворотом направо

///

public void MoveRight()

{

if (_isMoving)

{

Console.WriteLine(«Поворот направо был осуществлен успешно»);

}

else

{

Console.WriteLine(«Ошибка. Автомобиль еще не двигался с места. Поворот направо является на данный момент действием, невозможным для выполнения.»);

}

}

}

}

Спецификатор общего доступа

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

Следующий пример иллюстрирует это:

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

В предыдущем примере длина и ширина переменных-членов объявляются общедоступными , поэтому к ним можно получить доступ из функции Main (), используя экземпляр класса Rectangle с именем r .

Функция участника Display () и GetArea () также может напрямую обращаться к этим переменным без использования какого-либо экземпляра класса.

Функции-члены Display () также объявляются общедоступными , поэтому к нему также можно получить доступ из Main (), используя экземпляр класса Rectangle с именем r .

Ссылка на основную публикацию