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

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

Ме́тод в объектно-ориентированном программировании — это функция или процедура, принадлежащая[1] какому-то классу или объекту.

Как и процедура в процедурном программировании, метод состоит из некоторого количества операторов для выполнения какого-то действия и имеет набор входных аргументов.

Различают простые методы и статические методы (методы класса):

  • простые методы имеют доступ к данным объекта (конкретного экземпляра данного класса),
  • статические методы не имеют доступа к данным объекта, и для их использования не нужно создавать экземпляры (данного класса).

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

В зависимости от того, какой уровень доступа предоставляет тот или иной метод, выделяют:

  • открытый (public) интерфейс — общий интерфейс для всех пользователей данного класса;
  • защищённый (protected) интерфейс — внутренний интерфейс для всех наследников данного класса;
  • закрытый (private) интерфейс — интерфейс, доступный только изнутри данного класса.

Такое разделение интерфейсов позволяет сохранять неизменным открытый интерфейс, но изменять внутреннюю реализацию.

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

[править | править код]

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

public class Main {
    String _name;
    int _roll;

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

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

[править | править код]

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

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

abstract class Shape {
    abstract int area(int h, int w); // сигнатура абстрактного метода
}

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

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(); // разрешено
}

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

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

Примечания

[править | править код]
  1. Под принадлежностью подразумевается, что метод явно ассоциирован с обработкой определённого класса объектов. Теоретически, метод предназначен для обработки ассоциированного с ним типа, но фактически это необязательно.
  2. Abstract Methods and Classes. oracle.com. Oracle Java Documentation. Дата обращения: 11 декабря 2014. Архивировано 1 июня 2020 года.