Visibilidad en ABAP OO: Public, Protected y Private

Cuando empiezas a trabajar con clases en ABAP, no solo defines atributos y métodos, también decides quién puede acceder a ellos. Y aquí es donde entran en juego los niveles de visibilidad.

Si no controlas esto correctamente, puedes acabar con clases donde:

  • Todo es accesible desde fuera
  • Se modifican datos que no deberían tocarse
  • El código se vuelve difícil de mantener
  • Cualquier cambio interno afecta a otras partes del programa

En este artículo vamos a ver de forma clara y práctica:

  • Qué es la visibilidad en ABAP
  • Qué significan PUBLIC, PROTECTED y PRIVATE
  • Cuándo usar cada uno

¿Qué es la visibilidad en ABAP OO?

La visibilidad es el mecanismo que define desde dónde se puede acceder a los atributos y métodos de una clase. Es como definir permisos dentro de una clase, pues decides qué se puede usar desde fuera de la clase, que puede usar solo la clase o que pueden usar las clases hijas.

Este concepto es la base del encapsulamiento, uno de los pilares de la programación orientada a objetos. El encapsulamiento consiste en ocultar los detalles internos de una clase y exponer solo lo necesario.

Cómo se define la visibilidad en una clase

En ABAP, la visibilidad se organiza en tres secciones dentro de la definición de la clase:

CLASS lcl_ejemplo DEFINITION.
  PUBLIC SECTION.
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

Cada sección define quién puede acceder a lo que declares dentro de ella.

Tipos de visibilidad en una clase

PUBLIC SECTION

Los elementos definidos en PUBLIC SECTION son accesibles desde cualquier parte del programa. Es la interfaz pública de tu clase.

Ejemplo

CLASS lcl_persona DEFINITION.
  PUBLIC SECTION.
    METHODS:
      constructor IMPORTING iv_nombre TYPE string,
      set_nombre   IMPORTING iv_nombre TYPE string,
      get_nombre   RETURNING VALUE(rv_nombre) TYPE string,
      mostrar_info.
ENDCLASS.

CLASS lcl_persona IMPLEMENTATION.
  METHOD constructor.
    me->set_nombre( iv_nombre ).
  ENDMETHOD.

  METHOD mostrar_info.
    WRITE: / 'Nombre:', me->get_nombre( ).
  ENDMETHOD.
ENDCLASS.

" Desde cualquier parte del programa:
DATA(lo_persona) = NEW lcl_persona( 'Ana' ).
lo_persona->mostrar_info( ).   " ✅ Acceso permitido

Cuándo usarlo

  • Métodos que otros programas o clases deben utilizar
  • Funcionalidad principal que expone la clase
  • Punto de entrada a la lógica de negocio

⚠️ Si pones demasiado en PUBLIC, pierdes control sobre tu clase.

PROTECTED SECTION

Los elementos en PROTECTED SECTION son accesibles desde la propia clase y sus subclases (clases que heredan de ella). Es como un espacio «familiar», visible para la clase y sus hijos, pero no para el exterior.

Ejemplo

CLASS lcl_vehiculo DEFINITION.
  PROTECTED SECTION.
    DATA: combustible TYPE i.
    METHODS: consumir_combustible IMPORTING iv_cantidad TYPE i.
ENDCLASS.

CLASS lcl_vehiculo IMPLEMENTATION.
  METHOD consumir_combustible.
    combustible = combustible - iv_cantidad.
  ENDMETHOD.
ENDCLASS.

" Clase hija que hereda de lcl_vehiculo
CLASS lcl_coche DEFINITION INHERITING FROM lcl_vehiculo.
  PUBLIC SECTION.
    METHODS: arrancar.
ENDCLASS.

CLASS lcl_coche IMPLEMENTATION.
  METHOD arrancar. " ✅ Puede acceder a elementos PROTECTED de la clase padre
    consumir_combustible( 5 ).
    combustible = combustible - 1.  " También puede modificar atributos
  ENDMETHOD.
ENDCLASS.

DATA(lo_coche) = NEW lcl_coche( ).
lo_coche->arrancar( ).         " ✅ Acceso al método público
" lo_coche->combustible = 10.  " ❌ No se puede acceder directamente

Cuándo usarlo

  • Cuando trabajas con herencia
  • Cuando quieres compartir lógica o datos con clases hijas
  • Para métodos que deben ser reutilizados por subclases pero no expuestos al exterior

💡 Si no hay herencia, PROTECTED suele no aportar valor

PRIVATE SECTION

Los elementos en PRIVATE SECTION solo son accesibles dentro de la propia clase o clases amigas (FRIENDS). No son accesibles desde subclases ni fuera de la clase. Es el nivel más restrictivo y la base del encapsulamiento. Se utilizan para ocultar la lógica interna y proteger la integridad del estado de los datos del objeto.

Ejemplo

CLASS lcl_cuenta_bancaria DEFINITION.
  PUBLIC SECTION.
    METHODS:
      constructor IMPORTING iv_saldo_inicial TYPE p,
      depositar    IMPORTING iv_cantidad TYPE p,
      retirar      IMPORTING iv_cantidad TYPE p
                   RETURNING VALUE(rv_exito) TYPE abap_bool,
      get_saldo    RETURNING VALUE(rv_saldo) TYPE p.

  PRIVATE SECTION.
    DATA: saldo TYPE p DECIMALS 2.
    METHODS: validar_retiro IMPORTING iv_cantidad TYPE p
                            RETURNING VALUE(rv_valido) TYPE abap_bool.
ENDCLASS.

CLASS lcl_cuenta_bancaria IMPLEMENTATION.
  METHOD constructor.
    saldo = iv_saldo_inicial.
  ENDMETHOD.

  METHOD depositar.
    saldo = saldo + iv_cantidad.
  ENDMETHOD.

  METHOD validar_retiro.
    rv_valido = ( saldo >= iv_cantidad ).
  ENDMETHOD.

  METHOD retirar.
    IF validar_retiro( iv_cantidad ) = abap_true.
      saldo = saldo - iv_cantidad.
      rv_exito = abap_true.
    ELSE.
      rv_exito = abap_false.
    ENDIF.
  ENDMETHOD.

  METHOD get_saldo.
    rv_saldo = saldo.
  ENDMETHOD.
ENDCLASS.

DATA(lo_cuenta) = NEW lcl_cuenta_bancaria( 1000 ).
lo_cuenta->depositar( 500 ).     " ✅ Acceso público
lo_cuenta->retirar( 200 ).       " ✅ Acceso público
" lo_cuenta->saldo = 0;          " ❌ No se puede modificar directamente
" lo_cuenta->validar_retiro( )   " ❌ Método privado no accesible

Cuándo usarlo

  • Datos internos que deben estar protegidos
  • Implementación interna que no debe ser visible
  • Métodos auxiliares que solo usa la clase internamente

🔥 PRIVATE es la base del encapsulamiento, ya que oculta los detalles internos y protege la integridad de los datos.

Comparativa

VisibilidadAcceso desde fueraSubclasesMisma clase
PUBLIC
PROTECTEDNo
PRIVATENoNo

¿Cómo declaramos los atributos? ¿Públicos, protegidos o privados?

La respuesta corta es: casi siempre en PRIVATE. Uno de los errores mas comunes es exponer atributos como públicos. La mejor práctica es poner los atributos privados y usar métodos getters/setters para controlar el acceso.

❌ Errores comunes

  1. Todo en PUBLIC SECTION. Problema: No hay encapsulamiento. Cualquiera puede modificar atributos directamente.
  2. Métodos privados con lógica de negocio importante Si un método contiene lógica de negocio clave pero es privado, las subclases no pueden reutilizarlo. Solución: Evalúa si debería ser PROTECTED para permitir extensión.
  3. Métodos PROTECTED sin necesidad. Solución: Si no hay subclases, usa PRIVATE.

✅ Buena práctica: Principio de menor privilegio

Empieza con el nivel más restrictivo y solo amplía si es necesario.

  1. Por defecto: PRIVATE
  2. Si una subclase necesita acceder: PROTECTED
  3. Si el exterior necesita acceder: PUBLIC

La visibilidad no es solo una cuestión de sintaxis, es una decisión de diseño. Elegir correctamente entre PUBLIC, PROTECTED y PRIVATE te permite:

  • Proteger el estado de tus objetos
  • Reducir errores al limitar quién puede modificar qué
  • Escribir código más mantenible al ocultar detalles internos

Dominar la visibilidad es uno de los pasos clave para dejar de escribir código que «funciona» y empezar a escribir código profesional, robusto y mantenible.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *