Метод (компьютерное программирование)
Метод с в объектно-ориентированном программировании (ООП) — это процедура, связанная с объектом и, как правило, также сообщением . Объект состоит из данных о состоянии и поведения ; они составляют интерфейс , который определяет, как можно использовать объект. Метод — это поведение объекта, параметризованное пользователем.
Данные представлены как свойства объекта, а поведение — как методы. Например, Window
объект может иметь такие методы, как open
и close
, а его состояние (независимо от того, открыто оно или закрыто в любой момент времени) будет свойством.
В программировании на основе классов методы определяются внутри класса , а объекты являются экземплярами данного класса. Одной из наиболее важных возможностей, предоставляемых методом, является переопределение метода с тем же именем (например, area
) можно использовать для нескольких разных типов классов. Это позволяет объектам-отправителям вызывать поведение и делегировать реализацию этого поведения принимающему объекту. Метод в программировании на Java задает поведение объекта класса. Например, объект может отправить area
сообщение другому объекту и вызывается соответствующая формула, независимо от того, является ли принимающий объект rectangle
, circle
, triangle
, и т. д.
Методы также предоставляют интерфейс, который другие классы используют для доступа и изменения свойств объекта; это известно как инкапсуляция . Инкапсуляция и переопределение — две основные отличительные особенности между вызовами методов и процедур. [1]
Переопределение и перегрузка
[ редактировать ] метода Переопределение и перегрузка — два наиболее важных отличия метода от обычного вызова процедуры или функции. Переопределение относится к подклассу, переопределяющему реализацию метода своего суперкласса. Например, findArea
может быть методом, определенным в классе формы, [2] triangle
и т. д. каждый будет определять соответствующую формулу для расчета своей площади. Идея состоит в том, чтобы рассматривать объекты как «черные ящики», чтобы изменения во внутренней части объекта можно было вносить с минимальным влиянием на другие объекты, которые его используют. Это называется инкапсуляцией и предназначено для упрощения поддержки и повторного использования кода.
С другой стороны, перегрузка метода означает дифференциацию кода, используемого для обработки сообщения, на основе параметров метода. Если рассматривать принимающий объект как первый параметр в любом методе, то переопределение — это всего лишь частный случай перегрузки, когда выбор основан только на первом аргументе. Следующий простой пример Java иллюстрирует разницу:
Методы доступа, мутатора и менеджера
[ редактировать ]Методы доступа используются для чтения значений данных объекта. Методы-мутаторы используются для изменения данных объекта. Методы менеджера используются для инициализации и уничтожения объектов класса, например конструкторов и деструкторов.
Эти методы обеспечивают уровень абстракции , который облегчает инкапсуляцию и модульность . Например, если класс банковского счета предоставляет getBalance()
метод доступа для получения текущего баланса (вместо прямого доступа к полям данных баланса), тогда более поздние версии того же кода могут реализовать более сложный механизм получения баланса (например, выборку из базы данных ) без необходимости изменения зависимого кода . Концепции инкапсуляции и модульности не являются уникальными для объектно-ориентированного программирования. Действительно, во многих отношениях объектно-ориентированный подход является просто логическим расширением предыдущих парадигм, таких как абстрактные типы данных и структурированное программирование . [3]
Конструкторы
[ редактировать ]Конструктор — это метод, который вызывается в начале жизни объекта для создания и инициализации объекта. Этот процесс называется конструкцией (или созданием экземпляра ). Инициализация может включать в себя приобретение ресурсов. Конструкторы могут иметь параметры, но в большинстве языков обычно не возвращают значения. См. следующий пример на Java:
public class Main {
String _name;
int _roll;
Main(String name, int roll) { // constructor method
this._name = name;
this._roll = roll;
}
}
Деструктор
[ редактировать ]Деструктор — это метод, который вызывается автоматически в конце жизни объекта, процесс называется Destruction . Уничтожение в большинстве языков не допускает аргументов метода деструктора и возвращаемых значений. Деструкторы могут быть реализованы для выполнения работ по очистке и других задач при уничтожении объекта.
Финализаторы
[ редактировать ]В языках со сборкой мусора , таких как Java , [4] : 26, 29 С# , [5] : 208–209 и Python деструкторы известны как финализаторы . Их цель и функции аналогичны деструкторам, но из-за различий между языками, использующими сборку мусора, и языками с ручным управлением памятью, последовательность их вызова различна.
Абстрактные методы
[ редактировать ]Абстрактный метод — это метод, имеющий только сигнатуру и не имеющий тела реализации . Его часто используют для указания того, что подкласс должен предоставлять реализацию метода, как в абстрактном классе . Абстрактные методы используются для указания интерфейсов в некоторых языках программирования. [6]
Пример
[ редактировать ]Следующий код Java показывает абстрактный класс, который необходимо расширить:
abstract class Shape {
abstract int area(int h, int w); // abstract method signature
}
Следующий подкласс расширяет основной класс:
public class Rectangle extends Shape {
@Override
int area(int h, int w) {
return h * w;
}
}
Реабстракция
[ редактировать ]Если подкласс предоставляет реализацию абстрактного метода, другой подкласс может снова сделать его абстрактным. Это называется реабстракция .
На практике это используется редко.
Пример
[ редактировать ]В C# виртуальный метод можно переопределить абстрактным методом. (Это также относится к Java, где все неприватные методы являются виртуальными.)
class IA
{
public virtual void M() { }
}
abstract class IB : IA
{
public override abstract void M(); // allowed
}
Методы интерфейсов по умолчанию также могут быть повторно абстрагированы, что потребует создания подклассов для их реализации. (Это также относится к Java.)
interface IA
{
void M() { }
}
interface IB : IA
{
abstract void IA.M();
}
class C : IB { } // error: class 'C' does not implement 'IA.M'.
Методы класса
[ редактировать ]Методы класса — это методы, которые вызываются в классе , а не в экземпляре. Обычно они используются как часть метамодели объекта . Т.е. для каждого определенного класса создается экземпляр объекта класса в метамодели. Протоколы метамодели позволяют создавать и удалять классы. В этом смысле они предоставляют ту же функциональность, что и описанные выше конструкторы и деструкторы. Но в некоторых языках, таких как Common Lisp Object System (CLOS), метамодель позволяет разработчику динамически изменять объектную модель во время выполнения: например, создавать новые классы, переопределять иерархию классов, изменять свойства и т. д.
Специальные методы
[ редактировать ]Специальные методы очень специфичны для языка, и язык может поддерживать ни один, некоторые или все специальные методы, определенные здесь. Компилятор языка может автоматически генерировать специальные методы по умолчанию, или программисту может быть разрешено опционально определять специальные методы. Большинство специальных методов не могут быть вызваны напрямую, вместо этого компилятор генерирует код для их вызова в подходящее время.
Статические методы
[ редактировать ]Статические методы предназначены для применения ко всем экземплярам класса, а не к какому-либо конкретному экземпляру. В этом смысле они похожи на статические переменные . Примером может служить статический метод для суммирования значений всех переменных каждого экземпляра класса. Например, если бы существовал Product
class, он может иметь статический метод для вычисления средней цены всех продуктов.
Статический метод можно вызвать, даже если экземпляры класса еще не существуют. Статические методы называются «статическими», поскольку они разрешаются во время компиляции в зависимости от класса, из которого они вызваны, а не динамически, как в случае с методами экземпляра, которые разрешаются полиморфно в зависимости от типа объекта во время выполнения.
Примеры
[ редактировать ]На Яве
[ редактировать ]В Java обычно используемый статический метод:
Math.max(double a, double b)
Этот статический метод не имеет объекта-владельца и не запускается в экземпляре. Он получает всю информацию из своих аргументов. [2]
Операторы копирования-присваивания
[ редактировать ]Операторы копирования-присваивания определяют действия, которые должен выполнить компилятор, когда объект класса присваивается объекту класса того же типа.
Операторные методы
[ редактировать ]Методы оператора определяют или переопределяют символы оператора и определяют операции, которые необходимо выполнить с символом и связанными с ним параметрами метода. Пример С++:
#include <string>
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_;
}
private:
std::string name_;
int roll_;
};
Функции-члены в C++
[ редактировать ]Некоторые процедурные языки были расширены объектно-ориентированными возможностями, чтобы использовать большие наборы навыков и устаревший код для этих языков, но при этом обеспечивать преимущества объектно-ориентированной разработки. Пожалуй, самым известным примером является C++ , объектно-ориентированное расширение языка C. программирования Из-за требований к проектированию, требующих добавления объектно-ориентированной парадигмы к существующему процедурному языку, передача сообщений в C++ имеет некоторые уникальные возможности и терминологию. Например, в C++ метод известен как функция-член . В C++ также есть концепция виртуальных функций , которые являются функциями-членами, которые могут быть переопределены в производных классах и допускают динамическую отправку .
Виртуальные функции
[ редактировать ]Виртуальные функции — это средства, с помощью которых класс C++ может добиться полиморфного поведения. Невиртуальные функции-члены , или обычные методы , — это те, которые не участвуют в полиморфизме .
Пример С++:
#include <iostream>
#include <memory>
class Super {
public:
virtual ~Super() = default;
virtual void IAm() { std::cout << "I'm the super class!\n"; }
};
class Sub : public Super {
public:
void IAm() override { std::cout << "I'm the subclass!\n"; }
};
int main() {
std::unique_ptr<Super> inst1 = std::make_unique<Super>();
std::unique_ptr<Super> inst2 = std::make_unique<Sub>();
inst1->IAm(); // Calls |Super::IAm|.
inst2->IAm(); // Calls |Sub::IAm|.
}
См. также
[ редактировать ]- Свойство (программирование)
- Удаленный вызов метода
- Подпрограмма , также называемая подпрограммой, процедурой, процедурой или функцией.
Примечания
[ редактировать ]- ^ «Что такое объект?» . oracle.com . Корпорация Оракл . Проверено 13 декабря 2013 г.
- ^ Jump up to: а б Мартин, Роберт С. (2009). Чистый код: Справочник по гибкому программному обеспечению . Прентис Холл. п. 296. ИСБН 978-0-13-235088-4 .
- ^ Мейер, Бертран (1988). Объектно-ориентированное построение программного обеспечения . Кембридж: Международная серия Прентис Холл по информатике. стр. 52–54. ISBN 0-13-629049-3 .
- ^ Блох, Джошуа (2018). «Эффективная Java: Руководство по языку программирования» (третье изд.). Аддисон-Уэсли. ISBN 978-0134685991 .
- ^ Альбахари, Джозеф. C# 10 в двух словах О'Рейли. ISBN 978-1-098-12195-2 .
- ^ «Абстрактные методы и классы» . 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 Обучение. 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 .
- Скиннер, Монтана (1992). Книга продвинутого уровня C++ . Силиконовый пресс. ISBN 978-0-929306-10-0 .
- Любовь (1 сентября 2005 г.). Разработка ядра Linux . Пирсон Образование. ISBN 978-81-7758-910-8 .
- ДЕХУРИ, САТЧИДАНАНДА; ДЖАГАДЕВ, АЛОК КУМАР; РАТ, АМИЯ КУМАР (8 мая 2007 г.). ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ C++ . PHI Learning Pvt. ООО ISBN 978-81-203-3085-6 .