Jump to content

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

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

Данные представлены как свойства объекта, а поведение — как методы. Например, 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|.
}

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ «Что такое объект?» . oracle.com . Корпорация Оракл . Проверено 13 декабря 2013 г.
  2. ^ Jump up to: а б Мартин, Роберт С. (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 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 2713f52ccae84d5e214fefb6cd756afa__1716130800
URL1:https://arc.ask3.ru/arc/aa/27/fa/2713f52ccae84d5e214fefb6cd756afa.html
Заголовок, (Title) документа по адресу, URL1:
Method (computer programming) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)