Os especificadores de acesso são usados para definir a visibilidade de elementos no código Verse. Eles podem ser usados em classes, campos, métodos e outros elementos.
O especificador <public> indica que o elemento está disponível em qualquer parte do código.
O especificador <protected> indica que o elemento está disponível na própria classe e em suas subclasses.
O especificador <private> indica que o elemento está disponível na própria classe mas as subclasses não conseguem acessar.
Quando não é usado um especificador de acesso, o elemento usa o especificador padrão que é o <internal> que indica que o elemento está disponível no módulo em que ele está. O próximo artigo será sobre módulos.
O código abaixo é um exemplo de classe que foi criada apenas para mostrar a aplicação dos especificadores de acesso na classe, em campos e no método.
weapon := class<public>():
var<protected> ammunition<public>: int = 10
calibration<private> : float = 0.03
Fire<public>(): void =
if (ammunition > 0):
set ammunition -= 1
Print("Weapon fired")
else:
Print("No ammo")
Nas variáveis o especificador usado ao lado de var indica onde ela pode ser modificada. O especificador usado ao lado no nome da variável indica onde ela pode ser acessada. No exemplo acima a variável ammunition pode ser acessada em qualquer lugar mas só pode ser modificada na própria classe e nas subclasses.
Considere WeaponInstance uma instância da classe weapon que está sendo usada dentro de outra classe. Os acessos abaixo são válidos porque os elementos são <public>:
Print("{WeaponInstance.ammunition}")
WeaponInstance.Fire()
Os acessos abaixo são inválidos porque calibration é <private> e o var de ammunition é <protected>:
Print("{WeaponInstance.calibration}")
set WeaponInstance.ammunition = 15
O código abaixo cria a subclasse rifle_grenade usando weapon como superclasse. A variável grenades está usando o especificador de acesso default que é o <internal>.
rifle_grenade := class<public>(weapon):
var grenades: int = 3
LaunchGrenade<public>():void =
if (grenades > 0):
set grenades -= 1
Print("Grenade launched")
else:
Print("No grenade")
RifleStatus<public>():void =
Print("ammunition: {ammunition} | grenades: {grenades}")
No método RifleStatus() podemos ver que a variável ammunition da superclasse weapon é acessível. Ela também pode ser modificada na subclasse.
A variável calibration não é acessível na subclasse rifle_grenade porque ela é <private>.
O código abaixo mostra estas classes de exemplo em um único arquivo para poder testar no UEFN. Eu criei um dispositivo verse chamado access_specifiers_device e usei este código:using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
weapon := class<public>():
var<protected> ammunition<public>: int = 10
calibration<private> : float = 0.03
Fire<public>(): void =
if (ammunition > 0):
set ammunition -= 1
Print("Weapon fired")
else:
Print("No ammo")
rifle_grenade := class<public>(weapon):
var grenades: int = 3
LaunchGrenade<public>():void =
if (grenades > 0):
set grenades -= 1
Print("Grenade launched")
else:
Print("No grenade")
RifleStatus<public>():void =
Print("ammunition: {ammunition} | grenades: {grenades}")
access_specifiers_device := class(creative_device):
RifleGrenade : rifle_grenade = rifle_grenade{}
OnBegin<override>()<suspends>:void=
Print("{RifleGrenade.ammunition}")
RifleGrenade.Fire()
RifleGrenade.LaunchGrenade()
RifleGrenade.RifleStatus()
Este dispositivo Verse cria uma instância da classe rifle_grenade e acessa a variável ammunition e o método Fire() da superclasse weapon e mais dois métodos da própria classe rifle_grenade.