Método (programação de computador)

Da Wikipédia, a enciclopédia livre
Ir para a navegação Pular para pesquisar

Um método em programação orientada a objetos (OOP) é ​​um procedimento associado a uma mensagem e um objeto . Um objeto consiste em dados de estado e comportamento ; estes compõem uma interface , que especifica como o objeto pode ser utilizado por qualquer um de seus diversos consumidores. Um método é um comportamento de um objeto parametrizado por um consumidor.

Os dados são representados como propriedades do objeto e os comportamentos são representados como métodos. Por exemplo, um Windowobjeto pode ter métodos como opene close, enquanto seu estado (seja ele aberto ou fechado em um determinado ponto no tempo) seria uma propriedade.

Na programação baseada em classe , os métodos são definidos dentro de uma classe e os objetos são instâncias de uma determinada classe. Um dos recursos mais importantes que um método fornece é a substituição de método - o mesmo nome (por exemplo, area) pode ser usado para vários tipos diferentes de classes. Isso permite que os objetos de envio invoquem comportamentos e deleguem a implementação desses comportamentos ao objeto de recebimento. Um método na programação Java define o comportamento de um objeto de classe. Por exemplo, um objeto pode enviar uma areamensagem para outro objeto e a fórmula apropriada é invocada se o objeto receptor for um rectangle, circle, triangle, etc.

Os métodos também fornecem a interface que outras classes usam para acessar e modificar as propriedades de um objeto; isso é conhecido como encapsulamento . Encapsulamento e substituição são os dois principais recursos de distinção entre métodos e chamadas de procedimento. [1]

Substituindo e sobrecarregando

Sobreposição e sobrecarga de método são duas das maneiras mais significativas pelas quais um método difere de um procedimento convencional ou chamada de função. Overriding refere-se a uma subclasse redefinindo a implementação de um método de sua superclasse. Por exemplo, findAreapode ser um método definido em uma classe de forma, [2] triangle , etc. cada um definiria a fórmula apropriada para calcular sua área. A ideia é olhar para os objetos como "caixas pretas" para que as alterações internas do objeto possam ser feitas com o mínimo de impacto nos outros objetos que o utilizam. Isso é conhecido como encapsulamento e destina-se a tornar o código mais fácil de manter e reutilizar.

A sobrecarga de método, por outro lado, refere-se à diferenciação do código usado para manipular uma mensagem com base nos parâmetros do método. Se alguém visualizar o objeto receptor como o primeiro parâmetro em qualquer método, a substituição é apenas um caso especial de sobrecarga em que a seleção é baseada apenas no primeiro argumento. O seguinte exemplo simples de Java ilustra a diferença:

Métodos de acesso, modificador e gerenciador

Métodos de acesso são usados ​​para ler os valores de dados de um objeto. Os métodos Mutator são usados ​​para modificar os dados de um objeto. Métodos gerenciadores são usados ​​para inicializar e destruir objetos de uma classe, por exemplo, construtores e destruidores.

Esses métodos fornecem uma camada de abstração que facilita o encapsulamento e a modularidade . Por exemplo, se uma classe de conta bancária fornece um getBalance()método de acesso para recuperar o saldo atual (em vez de acessar diretamente os campos de dados do saldo), revisões posteriores do mesmo código podem implementar um mecanismo mais complexo para recuperação do saldo (por exemplo, um banco de dados fetch), sem que o código dependente precise ser alterado. Os conceitos de encapsulamento e modularidade não são exclusivos da programação orientada a objetos. De fato, de muitas maneiras, a abordagem orientada a objetos é simplesmente a extensão lógica de paradigmas anteriores, como tipos de dados abstratos eprogramação estruturada . [3]

Construtores

Um construtor é um método chamado no início do tempo de vida de um objeto para criar e inicializar o objeto, um processo chamado construção (ou instanciação ). A inicialização pode incluir uma aquisição de recursos. Os construtores podem ter parâmetros, mas geralmente não retornam valores na maioria dos idiomas. Veja o seguinte exemplo em Java:

public  class  Main  { 
    String  _name ; 
    int_rolo  ; _

    Main ( String  name ,  int  roll )  {  // método construtor 
        this . _nome  =  nome ; 
        isso . _roll  =  roll ; 
    } 
}

Destruidores

Um destruidor é um método chamado automaticamente no final do tempo de vida de um objeto, um processo chamado de destruição . A destruição na maioria das linguagens não permite argumentos de método destruidor nem valores de retorno. A destruição pode ser implementada para executar tarefas de limpeza e outras tarefas na destruição de objetos.

Finalizadores

Em linguagens com coleta de lixo , como Java , C# e Python , os destruidores são conhecidos como finalizadores . Eles têm um propósito e função semelhantes aos destruidores, mas devido às diferenças entre linguagens que utilizam coleta de lixo e linguagens com gerenciamento manual de memória, a sequência em que são chamadas é diferente.

Métodos abstratos

Um método abstrato é aquele com apenas uma assinatura e nenhum corpo de implementação . Geralmente é usado para especificar que uma subclasse deve fornecer uma implementação do método. Métodos abstratos são usados ​​para especificar interfaces em algumas linguagens de programação. [4]

Exemplo

O código Java a seguir mostra uma classe abstrata que precisa ser estendida:

 classe  abstrata Forma  { 
    área int abstrata  ( int h , int w ); // assinatura do método abstrato }     

A seguinte subclasse estende a classe principal:

public  class  Rectangle  extends  Shape  { 
    @Override 
    int  area ( int  h ,  int  w )  { 
        return  h  *  w ; 
    } 
}

Reabstração

Se uma subclasse fornece uma implementação para um método abstrato, outra subclasse pode torná-la abstrata novamente. Isso é chamado de reabstração .

Na prática, isso raramente é usado.

Exemplo

Em C#, um método virtual pode ser substituído por um método abstrato. (Isso também se aplica a Java, onde todos os métodos não privados são virtuais.)

classe IA 
{
    vazio virtual público M () { }     
}
classe abstrata IB : IA    
{
    public override abstract void M (); // permitido }     

Os métodos padrão das interfaces também podem ser reabstraídos, exigindo subclasses para implementá-los. (Isso também se aplica a Java.)

interface IA 
{
    vazio M () { }   
}
interface IB : IA   
{
    vazio abstrato IA . M ();  
}
class C : IB { } // erro: class 'C' não implementa 'IA.M'.      

Métodos de classe

Métodos de classe são métodos chamados em uma classe em vez de uma instância. Eles são normalmente usados ​​como parte de um metamodelo de objeto . Ou seja, para cada classe definida é criada uma instância do objeto classe no meta-modelo. Protocolos de meta-modelo permitem que classes sejam criadas e deletadas. Nesse sentido, eles fornecem a mesma funcionalidade dos construtores e destruidores descritos acima. Mas em algumas linguagens, como o Common Lisp Object System (CLOS), o metamodelo permite que o desenvolvedor altere dinamicamente o modelo de objeto em tempo de execução: por exemplo, para criar novas classes, redefinir a hierarquia de classes, modificar propriedades, etc.

Métodos especiais

Os métodos especiais são muito específicos do idioma e um idioma pode suportar nenhum, alguns ou todos os métodos especiais definidos aqui. O compilador de uma linguagem pode gerar automaticamente métodos especiais padrão ou um programador pode opcionalmente definir métodos especiais. A maioria dos métodos especiais não pode ser chamada diretamente, mas o compilador gera o código para chamá-los nos momentos apropriados.

Métodos estáticos

Os métodos estáticos devem ser relevantes para todas as instâncias de uma classe, e não para qualquer instância específica. Elas são semelhantes às variáveis ​​estáticas nesse sentido. Um exemplo seria um método estático para somar os valores de todas as variáveis ​​de cada instância de uma classe. Por exemplo, se houvesse uma Productclasse, ela poderia ter um método estático para calcular o preço médio de todos os produtos.

Em Java, um método estático comumente usado é:

Math.max(duplo a, duplo b)

Este método estático não possui nenhum objeto proprietário e não é executado em uma instância. Ele recebe todas as informações de seus argumentos. [2]

Um método estático pode ser invocado mesmo que ainda não existam instâncias da classe. Os métodos estáticos são chamados de "estáticos" porque são resolvidos em tempo de compilação com base na classe em que são chamados e não dinamicamente, como no caso dos métodos de instância, que são resolvidos polimorficamente com base no tipo de tempo de execução do objeto.

Operadores de atribuição de cópia

Os operadores de atribuição de cópia definem ações a serem executadas pelo compilador quando um objeto de classe é atribuído a um objeto de classe do mesmo tipo.

Métodos do operador

Os métodos do operador definem ou redefinem os símbolos do operador e definem as operações a serem executadas com o símbolo e os parâmetros do método associado. Exemplo de C++:

#include <string> 

classe Dados {  
 público :
  operador bool < ( const Data & data ) const { return roll_ < data . rolar_ ; }          
  operador bool == ( const Dados e dados ) const {     
    return nome_ == dados . nome_ && roll_ == dados . rolar_ ;       
  }

 privado :
  std :: string name_ ; 
  int roll_ ; 
};

Funções membro em C++

Algumas linguagens procedurais foram estendidas com recursos orientados a objetos para alavancar os grandes conjuntos de habilidades e código legado para essas linguagens, mas ainda oferecem os benefícios do desenvolvimento orientado a objetos. Talvez o exemplo mais conhecido seja C++ , uma extensão orientada a objetos da linguagem de programação C. Devido aos requisitos de design para adicionar o paradigma orientado a objetos a uma linguagem procedural existente, a passagem de mensagens em C++ tem alguns recursos e terminologias exclusivos. Por exemplo, em C++, um método é conhecido como função-membro . C++ também tem o conceito de funções virtuais que são funções de membro que podem ser substituídas em classes derivadas e permitemdespacho dinâmico .

Funções virtuais

As funções virtuais são os meios pelos quais uma classe C++ pode obter comportamento polimórfico. Funções de membro não virtuais , ou métodos regulares , são aquelas que não participam do polimorfismo .

C++ Exemplo:

#include <iostream> 
#include <memória> 

classe  super { 
 público :
  virtual ~ Super () = padrão ;   

  virtual void IAm () { std :: cout << "Eu sou a superclasse! \n " ; }       
};

classe  Sub : público Super {    
 público :
  void IAm () override { std :: cout << "Eu sou a subclasse! \n " ; }       
};

int principal () {  
  std :: unique_ptr < Super > inst1 = std :: make_unique < Super > ();   
  std :: unique_ptr < Super > inst2 = std :: make_unique < Sub > ();   

  inst1 -> IAm (); // Chama |Super::IAm|. inst2 -> IAm (); // Chama |Sub::IAm|. }  
    

Veja também

Notas

  1. ^ "O que é um objeto?" . oracle. com . Oracle Corporation . Consultado em 13 de dezembro de 2013 .
  2. ^ a b Martin, Robert C. (2009). Código Limpo: Um Manual de Artesanato de Software Ágil . Prentice Hall. pág. 296. ISBN 978-0-13-235088-4.
  3. ^ Meyer, Bertrand (1988). Construção de Software Orientado a Objetos . Cambridge: Série Internacional Prentice Hall em Ciência da Computação. pp. 52–54. ISBN 0-13-629049-3.
  4. ^ "Métodos abstratos e classes" . oracle. com . Documentação do Oracle Java . Acesso em 11 de dezembro de 2014 .

Referências