stringtranslate.com

Метод (компьютерное программирование)

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

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

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

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

Переопределение и перегрузка

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

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

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

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

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

Конструкторы

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

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

Деструктор

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

Финализаторы

В языках со сборкой мусора , таких как Java , [4] : ​​26, 29  C# , [5] : 208–209  и Python , деструкторы известны как финализаторы . Их цель и функции аналогичны деструкторам, но из-за различий между языками, использующими сборку мусора, и языками с ручным управлением памятью, последовательность их вызова различна.

Абстрактные методы

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

Пример

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

абстрактный класс Shape { абстрактная область int ( int h , int w ); // сигнатура абстрактного метода }          

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

общественный класс Rectangle расширяет форму { @Override int area ( int h , int w ) { return h * w ; } }                 

Реабстракция

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

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

Пример

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

класс IA { общественный виртуальный недействительный M () { } } абстрактный класс IB : IA { общественный переопределенный абстрактный недействительный M (); // допустимый }                 

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

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

Методы класса

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

Специальные методы

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

Статические методы

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

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

Примеры

На Яве

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

Math.max(двойной а, двойной б)

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

Операторы копирования-присваивания

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

Операторные методы

Методы оператора определяют или переопределяют символы оператора и определяют операции, которые необходимо выполнить с символом и связанными с ним параметрами метода. Пример С++:

#include <строка> class Data { public : bool оператор < ( const Data & data ) const { returnroll_ < data . _ рулон_ ; } Booloperator == ( const Data & data ) const { return name_ == data . _ name_ && roll_ == данные . рулон_ ; }                              частный : std :: строка name_ ; introll_ ; _ };    

Функции-члены в C++

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

Виртуальные функции

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

Пример С++:

#include <iostream> #include <память>  класс Супер { общественный : виртуальный ~ Супер () = по умолчанию ;        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. ^ «Что такое объект?». oracle.com . Корпорация Оракл . Проверено 13 декабря 2013 г.
  2. ^ аб Мартин, Роберт С. (2009). Чистый код: Справочник по гибкому программному обеспечению . Прентис Холл. п. 296. ИСБН 978-0-13-235088-4.
  3. ^ Мейер, Бертран (1988). Объектно-ориентированное построение программного обеспечения . Кембридж: Международная серия Прентис Холл по информатике. стр. 52–54. ISBN 0-13-629049-3.
  4. ^ Блох, Джошуа (2018). «Эффективная Java: Руководство по языку программирования» (третье изд.). Аддисон-Уэсли. ISBN 978-0134685991.
  5. ^ Альбахари, Джозеф. Кратко о C#10 . О'Рейли. ISBN 978-1-098-12195-2.
  6. ^ «Абстрактные методы и классы». oracle.com . Документация Oracle Java . Проверено 11 декабря 2014 г.

Рекомендации