Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Данные представлены как свойства объекта, а поведение - как методы. Например, у Windowобъекта могут быть такие методы, как openи close, а его состояние (открыто или закрыто в любой момент времени) будет свойством.

В программировании на основе классов методы определяются внутри класса , а объекты являются экземплярами данного класса. Одной из наиболее важных возможностей, которые предоставляет метод, является переопределение метода - одно и то же имя (например, area) может использоваться для нескольких различных типов классов. Это позволяет отправляющим объектам вызывать поведение и делегировать реализацию этого поведения принимающему объекту. Метод в программировании на Java устанавливает поведение объекта класса. Например, объект может послать areaсообщение другому объекту и соответствующая формула вызывается ли принимающий объект а rectangle, circle, triangleи т.д.

Методы также предоставляют интерфейс, который другие классы используют для доступа и изменения свойств объекта; это известно как инкапсуляция . Инкапсуляция и переопределение - две основные отличительные особенности между методами и вызовами процедур. [2]

Переопределение и перегрузка [ править ]

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

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

Методы доступа, мутатора и менеджера [ править ]

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

Эти методы обеспечивают уровень абстракции, который упрощает инкапсуляцию и модульность . Например, если класс банковского счета предоставляет getBalance()метод доступа для извлечения текущего баланса (вместо прямого доступа к полям данных баланса), то более поздние версии того же кода могут реализовать более сложный механизм для извлечения баланса (например, база данных fetch) без изменения зависимого кода. Концепции инкапсуляции и модульности не уникальны для объектно-ориентированного программирования. Действительно, во многих отношениях объектно-ориентированный подход является просто логическим продолжением предыдущих парадигм, таких как абстрактные типы данных иструктурное программирование . [4]

Конструкторы [ править ]

Конструктор представляет собой метод , который вызывается в начале жизни объекта для создания и инициализации объекта, процесса , называемого строительства (или экземпляра ). Инициализация может включать в себя получение ресурсов. Конструкторы могут иметь параметры, но обычно не возвращают значения на большинстве языков. См. Следующий пример на Java:

открытый  класс  Main  {  String  _name ;  int  _roll ; Main ( String  name ,  int  roll )  {  // метод конструктора  this . _name  =  имя ;  это . _roll  =  roll ;  } }

Деструкторы [ править ]

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

Финализаторы [ править ]

В языках со сборкой мусора , таких как Java , C # и Python , деструкторы известны как финализаторы . У них схожая цель и функции с деструкторами, но из-за различий между языками, использующими сборку мусора, и языками с ручным управлением памятью, последовательность их вызова отличается.

Абстрактные методы [ править ]

Абстрактный метод является один только с подписью и без тела реализации . Он часто используется, чтобы указать, что подкласс должен обеспечивать реализацию метода. Абстрактные методы используются для указания интерфейсов в некоторых языках программирования. [5]

Пример [ править ]

Следующий код Java показывает абстрактный класс, который необходимо расширить:

абстрактный  класс  Shape  {  абстрактный  INT  область ( INT  ч ,  INT  ш );  // подпись абстрактного метода }

Следующий подкласс расширяет основной класс:

открытый  класс  Rectangle  расширяет  Shape  {  @Override  int  area ( int  h ,  int  w )  {  return  h  *  w ;  } }

Реконструкция [ править ]

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

На практике это используется редко.

Пример [ править ]

В C # виртуальный метод можно переопределить абстрактным методом. (Это также относится к Java, где все не приватные методы являются виртуальными.)

class  IA {  public  virtual  void  M ()  {  } } абстрактный  класс  IB  :  IA {  public  override  abstract  void  M ();  // разрешено }

Методы интерфейсов по умолчанию также могут быть реорганизованы, требуя подклассов для их реализации. (Это также относится к Java.)

interface  IA {  void  M ()  {  } } interface  IB  :  IA {  abstract  void  IA . M (); } class  C  :  IB  {  }  // ошибка: класс C не реализует IA.M.

Методы класса [ править ]

Методы класса - это методы, которые вызываются для класса, а не для экземпляра. Обычно они используются как часть метамодели объекта . Т.е. для каждого определенного класса создается экземпляр объекта класса в метамодели. Протоколы метамодели позволяют создавать и удалять классы. В этом смысле они предоставляют те же функции, что и конструкторы и деструкторы, описанные выше. Но в некоторых языках, таких как Common Lisp Object System (CLOS), метамодель позволяет разработчику динамически изменять объектную модель во время выполнения: например, создавать новые классы, переопределять иерархию классов, изменять свойства и т. Д.

Специальные методы [ править ]

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

Статические методы [ править ]

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

В Java обычно используется статический метод:

Math.max (двойной a, двойной b)

Этот статический метод не имеет объекта-владельца и не работает в экземпляре. Он получает всю информацию из своих аргументов. [3]

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

Операторы присваивания копий [ править ]

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

Методы оператора [ править ]

Методы операторов определяют или переопределяют символы операторов и определяют операции, которые должны выполняться с символом и соответствующими параметрами метода. Пример C ++:

#include  <строка>class  Data  {  public :  bool  operator < ( const  Data &  data )  const  {  return  roll_  <  data . roll_ ;  }  bool  operator == ( const  Data &  data )  const  {  return  name_  ==  data . name_  &&  roll_  ==  data . roll_ ;  } частный :  std :: string  name_ ;  int  roll_ ; };

Функции-члены в C ++ [ править ]

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

Виртуальные функции [ править ]

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

Пример C ++:

#include  <iostream>#include  <память>класс  Super  {  общедоступный :  виртуальный  ~ Super ()  = по  умолчанию ; virtual  void  IAm ()  {  std :: cout  <<  "Я суперкласс! \ n " ;  } };class  Sub  :  public  Super  {  public :  void  IAm ()  override  {  std :: cout  <<  "Я подкласс! \ n " ;  } };int  main ()  {  std :: unique_ptr < Super >  inst1  =  std :: make_unique < Super > ();  std :: unique_ptr < Super >  inst2  =  std :: make_unique < Sub > (); inst1 -> IAm ();  // Вызовы | Super :: IAm |.  inst2 -> IAm ();  // Вызовы | Sub :: IAm |. }

См. Также [ править ]

  • Свойство (программирование)
  • Вызов удаленного метода
  • Подпрограмма , также называемая подпрограммой, подпрограммой, процедурой или функцией

Заметки [ править ]

  1. ^ Потребители объекта могут состоять из различных видов элементов, таких как другие программы, удаленные компьютерные системы или компьютерные программисты, которые хотят использовать объект как часть своих собственных программ.
  2. ^ "Что такое объект?" . oracle.com . Корпорация Oracle . Проверено 13 декабря 2013 года .
  3. ^ а б Мартин, Роберт С. (2009). Чистый код: руководство по созданию гибкого программного обеспечения . Прентис Холл. п. 296. ISBN. 978-0-13-235088-4.
  4. ^ Мейер, Бертран (1988). Построение объектно-ориентированного программного обеспечения . Кембридж: Международная серия Prentice Hall по компьютерным наукам. С. 52–54. ISBN 0-13-629049-3.
  5. ^ «Абстрактные методы и классы» . oracle.com . Документация Oracle Java . Проверено 11 декабря 2014 .

Ссылки [ править ]

  • ЯНА ДЕБАСИШ (1 января 2005 г.). C ++ И ОБЪЕКТИВНОЕ ПРОГРАММИРОВАНИЕ . PHI Learning Pvt. ООО ISBN 978-81-203-2871-6.
  • Сенгупта, Пробал (1 августа 2004 г.). Объектно-ориентированное программирование: основы и приложения . PHI Learning Pvt. ООО ISBN 978-81-203-1258-6.
  • Свенк, Горан (2003). Объектно-ориентированное программирование: использование C ++ для инженерии и технологий . Cengage Learning. ISBN 0-7668-3894-3.
  • Балагурусамы (2013). Объектно-ориентированное программирование на C ++ . Тата Макгроу-Хилл Образование. ISBN 978-1-259-02993-6.
  • Кирх-Принц, Улла; Принц, Питер (2002). Полное руководство по программированию на C ++ . Джонс и Бартлетт Обучение. ISBN 978-0-7637-1817-6.
  • Конгер, Дэвид (2006). Создание игр на C ++: пошаговое руководство . Новые всадники. ISBN 978-0-7357-1434-2.
  • Скиннер, MT (1992). Продвинутая книга C ++ . Silicon Press. ISBN 978-0-929306-10-0.
  • Любовь (1 сентября 2005 г.). Разработка ядра Linux . Pearson Education. ISBN 978-81-7758-910-8.
  • ДЕХУРИ, САТЧИДАНАНДА; ДЖАГАДЕВ, АЛОК КУМАР; РАТ, АМИЯ КУМАР (8 мая 2007 г.). ОБЪЕКТИВНОЕ ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ C ++ . PHI Learning Pvt. ООО ISBN 978-81-203-3085-6.