Вопрос: В чем разница между методом и функцией?


Может ли кто-нибудь дать простое объяснение методы против функции в контексте ООП?


1423


источник


Ответы:


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

метод является частью кода, вызываемой именем, связанным с объектом. В большинстве случаев он идентичен функции, за исключением двух ключевых различий:

  1. Метод неявно передает объект, на который он был вызван.
  2. Метод способен работать с данными, содержащимися в классе (помня, что объект является экземпляром класса - класс является определением, объект является экземпляром этих данных).

(это упрощенное объяснение, игнорируя проблемы объем и т.д.)


1475



Метод находится на объекте.
Функция не зависит от объекта.

Для Java существуют только методы.
Для C существуют только функции.

Для C ++ это будет зависеть от того, находитесь ли вы в классе.


866



«Метод» является объектно-ориентированным словом для «Функция» , Это почти все, что есть для него (т. Е. Никакой реальной разницы).

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

На самом деле - это не так много, просто разные слова для одного и того же.

[поздно дополнение]


Фактически, поскольку Брайан Нил указывается в комментарии к этот вопрос , стандарт C ++ никогда не использует термин «метод» при ссылке на функции-члены. Некоторые люди могут считать это признаком того, что C ++ не является объектно-ориентированным языком; однако я предпочитаю считать это признаком того, что довольно умная группа людей не думала, что существует особая причина использовать другой термин.


162



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

Возьмем следующий пример python:

class Door:
  def open(self):
    print 'hello stranger'

def knock_door:
  a_door = Door()
  Door.open(a_door)

knock_door()

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

Как вы можете видеть, вы можете вызывать функцию где угодно, но если вы хотите вызвать метод, вам нужно передать новый объект того же типа, что и класс, объявленный методом (Class.method (object)), или вам нужно вызвать метод внутри объекта (object.Method ()), по крайней мере, в python.

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


81



Очень общее определение основного различия между функция и метод :

Функции определяются вне классов, а методы определены внутри и в части классов.


34



If you feel like reading here is "My introduction to OO methods"

The idea behind Object Oriented paradigm is to "threat" the software is composed of .. well "objects". Objects in real world have properties, for instance if you have an Employee, the employee has a name, an employee id, a position, he belongs to a department etc. etc.

The object also know how to deal with its attributes and perform some operations on them. Let say if we want to know what an employee is doing right now we would ask him.

employe whatAreYouDoing.

That "whatAreYouDoing" is a "message" sent to the object. The object knows how to answer to that questions, it is said it has a "method" to resolve the question.

So, the way objects have to expose its behavior are called methods. Methods thus are the artifact object have to "do" something.

Other possible methods are

employee whatIsYourName
employee whatIsYourDepartmentsName

etc.

Functions in the other hand are ways a programming language has to compute some data, for instance you might have the function addValues( 8 , 8 ) that returns 16

// pseudo-code
function addValues( int x, int y )  return x + y 
// call it 
result = addValues( 8,8 )
print result // output is 16...

Since first popular programming languages ( such as fortran, c, pascal ) didn't cover the OO paradigm, they only call to these artifacts "functions".

for instance the previous function in C would be:

int addValues( int x, int y ) 
{
   return x + y;
}

It is not "natural" to say an object has a "function" to perform some action, because functions are more related to mathematical stuff while an Employee has little mathematic on it, but you can have methods that do exactly the same as functions, for instance in Java this would be the equivalent addValues function.

public static int addValues( int x, int y ) {
    return x + y;
}

Looks familiar? That´s because Java have its roots on C++ and C++ on C.

At the end is just a concept, in implementation they might look the same, but in the OO documentation these are called method.

Here´s an example of the previously Employee object in Java.

public class Employee {

    Department department;
    String name;

    public String whatsYourName(){
        return this.name;
    }
    public String whatsYourDeparmentsName(){
         return this.department.name();
    }
    public String whatAreYouDoing(){
        return "nothing";
    } 
    // Ignore the following, only set here for completness
    public Employee( String name ) {
        this.name = name;
    }

}

// Usage sample.
Employee employee = new Employee( "John" ); // Creates an employee called John

// If I want to display what is this employee doing I could use its methods.
// to know it.
String name = employee.whatIsYourName():
String doingWhat = employee.whatAreYouDoint();

// Print the info to the console.

 System.out.printf("Employee %s is doing: %s", name, doingWhat );

Output:
Employee John is doing nothing.

The difference then, is on the "domain" where it is applied.

AppleScript have the idea of "natural language" matphor , that at some point OO had. For instance Smalltalk. I hope it may be reasonable easier for you to understand methods in objects after reading this.

NOTE: The code is not to be compiled, just to serve as an example. Feel free to modify the post and add Python example.


26



Simple way to remember:

  • Function → Free (Free means not belong to an object or class)
  • Method → Member (A member of an object or class)

19



In OO world, the two are commonly used to mean the same thing.

From a pure Math and CS perspective, a function will always return the same result when called with the same arguments ( f(x,y) = (x + y) ). A method on the other hand, is typically associated with an instance of a class. Again though, most modern OO languages no longer use the term "function" for the most part. Many static methods can be quite like functions, as they typically have no state (not always true).


15