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

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

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

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

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

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

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

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

учебный класс Класс1 {	int ж(int Икс) {		возвращаться Икс + 3;	}}учебный класс Класс2 расширяет Класс1 {	@Override	int ж(int Икс) { // переопределение		возвращаться Икс * Икс;	}	int ж(int Икс, int у) { // перегрузка		возвращаться Икс * у;	}}

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

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

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

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

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

общественный учебный класс Главный {    Нить _имя;    int _рулон;    Главный(Нить имя, int рулон) { // метод конструктора        это._имя = имя;        это._рулон = рулон;    }}

Деструкторы

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

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

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

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

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

Пример

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

Абстрактные учебный класс Форма {    Абстрактные int площадь(int час, int ш); // подпись абстрактного метода}

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

общественный учебный класс Прямоугольник расширяет Форма {    @Override    int площадь(int час, int ш) {        возвращаться час * ш;    }}

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

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

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

Пример

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

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

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

интерфейс Я{    пустота M() { }}интерфейс IB : Я{    Абстрактные пустота Я.M();}учебный класс C : IB { } // ошибка: класс 'C' не реализует 'IA.M'.

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

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

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

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

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

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

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

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

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

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

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

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

Операторские методы

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

#включают <string>учебный класс Данные { общественный:  bool оператор<(const Данные& данные) const { возвращаться рулон_ < данные.рулон_; }  bool оператор==(const Данные& данные) const {    возвращаться имя_ == данные.имя_ && рулон_ == данные.рулон_;  } частный:  стандартное::нить имя_;  int рулон_;};

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

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

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

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

Пример C ++:

#включают <iostream>#включают <memory>учебный класс супер { общественный:  виртуальный ~супер() = дефолт;  виртуальный пустота Я() { стандартное::cout << «Я супер класс! п"; }};учебный класс Sub : общественный супер { общественный:  пустота Я() отменять { стандартное::cout << "Я - подкласс! п"; }};int главный() {  стандартное::unique_ptr<супер> inst1 = стандартное::make_unique<супер>();  стандартное::unique_ptr<супер> inst2 = стандартное::make_unique<Sub>();  inst1->Я();  // Вызовы | Super :: IAm |.  inst2->Я();  // Вызовы | Sub :: IAm |.}

Смотрите также

Примечания

  1. ^ Потребители объекта могут состоять из различных видов элементов, таких как другие программы, удаленные компьютерные системы или компьютерные программисты, которые хотят использовать объект как часть своих собственных программ.
  2. ^ "Что такое объект?". oracle.com. Корпорация Oracle. Получено 13 декабря 2013.
  3. ^ http://www.codeproject.com/Articles/16407/METHOD-Overload-Vs-Overriding
  4. ^ Джон Сузуки (18 февраля 2000). "Что такое перегруженный метод?". http://www.jguru.com/: j Гуру. Получено 2011-08-12. Перегруженные методы - это несколько методов в одном классе с одинаковым именем, но с разными списками параметров. Перегруженные методы не могут иметь одинаковые списки параметров с разными типами возвращаемых значений.
  5. ^ Мейер, Бертран (1988). Построение объектно-ориентированного программного обеспечения. Кембридж: Международная серия Prentice Hall по компьютерным наукам. С. 52–54. ISBN  0-13-629049-3.
  6. ^ «Абстрактные методы и занятия». oracle.com. Документация Oracle Java. Получено 11 декабря 2014.
  7. ^ Мартин, Роберт С. (2009). Чистый код: руководство по созданию гибкого программного обеспечения. Прентис Холл. п. 296. ISBN  978-0-13-235088-4.

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