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
| Visibilidad | Acceso desde fuera | Subclases | Misma clase |
|---|---|---|---|
| PUBLIC | Sí | Sí | Sí |
| PROTECTED | No | Sí | Sí |
| PRIVATE | No | No | Sí |
¿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
- Todo en PUBLIC SECTION. Problema: No hay encapsulamiento. Cualquiera puede modificar atributos directamente.
- 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
PROTECTEDpara permitir extensión. - 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.
- Por defecto:
PRIVATE - Si una subclase necesita acceder:
PROTECTED - 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.

