SAP ABAP - Classes

Uma classe é usada para especificar a forma de um objeto e combina representação de dados e métodos para manipular esses dados em um pacote organizado. Os dados e funções dentro de uma classe são chamadosmembers of the class.

Definição e implementação de classes

Ao definir uma classe, você define um blueprint para um tipo de dados. Na verdade, isso não define nenhum dado, mas define o que significa o nome da classe, em que consistirá um objeto da classe e quais operações podem ser executadas em tal objeto. Ou seja, define as características abstratas de um objeto, como atributos, campos e propriedades.

A sintaxe a seguir mostra como definir uma classe -

CLASS <class_name> DEFINITION. 
.......... 
.......... 
ENDCLASS.

Uma definição de classe começa com a palavra-chave CLASS seguida pelo nome da classe, DEFINITION e o corpo da classe. A definição de uma classe pode conter vários componentes da classe, como atributos, métodos e eventos. Quando declaramos um método na declaração da classe, a implementação do método deve ser incluída na implementação da classe. A sintaxe a seguir mostra como implementar uma classe -

CLASS <class_name> IMPLEMENTATION. 
........... 
.......... 
ENDCLASS.

Note- A implementação de uma classe contém a implementação de todos os seus métodos. Em objetos ABAP, a estrutura de uma classe contém componentes como atributos, métodos, eventos, tipos e constantes.

Atributos

Atributos são campos de dados de uma classe que podem ter qualquer tipo de dados, como C, I, F e N. Eles são declarados na declaração da classe. Esses atributos podem ser divididos em 2 categorias: atributos de instância e estáticos. Ainstance attributedefine o estado específico da instância de um objeto. Os estados são diferentes para objetos diferentes. Um atributo de instância é declarado usando a instrução DATA.

Static attributesdefinir um estado comum de uma classe que é compartilhado por todas as instâncias da classe. Ou seja, se você alterar um atributo estático em um objeto de uma classe, a mudança também será visível para todos os outros objetos da classe. Um atributo estático é declarado usando a instrução CLASS-DATA.

Métodos

Um método é uma função ou procedimento que representa o comportamento de um objeto na classe. Os métodos da classe podem acessar qualquer atributo da classe. A definição de um método também pode conter parâmetros, de forma que você possa fornecer os valores para esses parâmetros quando os métodos são chamados. A definição de um método é declarada na declaração da classe e implementada na parte de implementação de uma classe. As instruções METHOD e ENDMETHOD são usadas para definir a parte de implementação de um método. A sintaxe a seguir mostra como implementar um método -

METHOD <m_name>. 
.......... 
.......... 
ENDMETHOD.

Nesta sintaxe, <m_name> representa o nome de um método. Note - Você pode chamar um método usando a instrução CALL METHOD.

Acessando atributos e métodos

Os componentes da classe podem ser definidos em seções de visibilidade pública, privada ou protegida que controlam como esses componentes podem ser acessados. A seção de visibilidade privada é usada para negar acesso a componentes de fora da classe. Esses componentes só podem ser acessados ​​de dentro da classe, como um método.

Os componentes definidos na seção de visibilidade pública podem ser acessados ​​de qualquer contexto. Por padrão, todos os membros de uma classe seriam privados. Na prática, definimos dados na seção privada e métodos relacionados na seção pública para que possam ser chamados de fora da classe, conforme mostrado no programa a seguir.

  • Os atributos e métodos declarados na seção Pública em uma classe podem ser acessados ​​por essa classe e qualquer outra classe, subclasse do programa.

  • Quando os atributos e métodos são declarados na seção Protegida em uma classe, eles podem ser acessados ​​por essa classe e subclasses (classes derivadas) apenas.

  • Quando os atributos e métodos são declarados na seção Private em uma classe, eles podem ser acessados ​​apenas por aquela classe e não por qualquer outra classe.

Exemplo

Report ZAccess1. 
CLASS class1 Definition.
   PUBLIC Section.
      Data: text1 Type char25 Value 'Public Data'.
      Methods meth1.
		
   PROTECTED Section.
      Data: text2 Type char25 Value 'Protected Data'.
		
   PRIVATE Section.     
      Data: text3 Type char25 Value 'Private Data'. 
ENDCLASS.
 
CLASS class1 Implementation.   
   Method meth1.     
      Write: / 'Public Method:',   
             / text1,
             / text2,
             / text3.
      Skip.
   EndMethod.
ENDCLASS. 

Start-Of-Selection.   
   Data: Objectx Type Ref To class1.
   Create Object: Objectx.
   CALL Method: Objectx→meth1.
   Write: / Objectx→text1.

O código acima produz a seguinte saída -

Public Method: 
Public Data 
Protected Data 
Private Data
  
Public Data

Atributos estáticos

Um atributo Static é declarado com a instrução CLASS-DATA. Todos os objetos ou instâncias podem usar o atributo estático da classe. Atributos estáticos são acessados ​​diretamente com a ajuda do nome da classe como class_name⇒name_1 = 'Algum Texto'.

Exemplo

A seguir está um programa onde queremos imprimir um texto com o número da linha 4 a 8 vezes. Definimos uma classe class1 e na seção pública declaramos CLASS-DATA (atributo estático) e um método. Após implementar a classe e o método, acessamos diretamente o atributo estático no evento Start-Of-Selection. Em seguida, apenas criamos a instância da classe e chamamos o método.

Report ZStatic1. 
CLASS class1 Definition.   
   PUBLIC Section.
      CLASS-DATA: name1 Type char45,
                  data1 Type I.
   Methods: meth1. 
ENDCLASS. 

CLASS class1 Implementation.   
   Method meth1.
      Do 4 Times.
         data1 = 1 + data1.
         Write: / data1, name1.
      EndDo.
      Skip.
   EndMethod. 
ENDCLASS. 

Start-Of-Selection. 
   class1⇒name1 = 'ABAP Object Oriented Programming'.
   class1⇒data1 = 0.
   Data: Object1 Type Ref To class1,
         Object2 Type Ref To class1.
			
   Create Object: Object1, Object2.
   CALL Method: Object1→meth1, 
                Object2→meth1.

O código acima produz a seguinte saída -

Construtores

Construtores são métodos especiais que são chamados automaticamente, ao criar um objeto ou acessar os componentes de uma classe. O construtor é acionado sempre que um objeto é criado, mas precisamos chamar um método para acionar o método geral. No exemplo a seguir, declaramos dois métodos públicos method1 e constructor. Ambos os métodos têm operações diferentes. Ao criar um objeto da classe, o método construtor aciona sua operação.

Exemplo

Report ZConstructor1. 
CLASS class1 Definition.
   PUBLIC Section.
      Methods: method1, constructor.
ENDCLASS. 

CLASS class1 Implementation.
   Method method1.
      Write: / 'This is Method1'.
   EndMethod.
	
   Method constructor.
      Write: / 'Constructor Triggered'.
   EndMethod. 
ENDCLASS. 

Start-Of-Selection.
   Data Object1 Type Ref To class1.
   Create Object Object1.

O código acima produz a seguinte saída -

Constructor Triggered

Operador ME em Métodos

Ao declarar uma variável de qualquer tipo na seção pública de uma classe, você pode usá-la em qualquer outra implementação. Uma variável pode ser declarada com um valor inicial na seção pública. Podemos declarar a variável novamente dentro de um método com um valor diferente. Quando escrevemos a variável dentro do método, o sistema irá imprimir o valor alterado. Para refletir o valor anterior da variável, temos que usar o operador 'ME'.

Neste programa, declaramos uma variável pública text1 e iniciamos com um valor. Declaramos a mesma variável novamente, mas instanciada com valor diferente. Dentro do método, estamos escrevendo essa variável com o operador 'ME' para obter o valor iniciado anteriormente. Obtemos o valor alterado declarando diretamente.

Exemplo

Report ZMEOperator1. 
CLASS class1 Definition.
   PUBLIC Section. 
	
Data text1 Type char25 Value 'This is CLASS Attribute'.
   Methods method1. 
ENDCLASS. 

CLASS class1 Implementation.
   Method method1. 
	
Data text1 Type char25 Value 'This is METHOD Attribute'.
   Write: / ME→text1,
          / text1.
   ENDMethod.
ENDCLASS. 

Start-Of-Selection.
   Data objectx Type Ref To class1.
   Create Object objectx.
   CALL Method objectx→method1.

O código acima produz a seguinte saída -

This is CLASS Attribute 
This is METHOD Attribute