Os especificadores de classe são usados na criação das classes para definir comportamentos e características. Neste artigo serão apresentados os principais.
O especificador <abstract> é usado para criar superclasses com campos e métodos comuns para serem herdados por subclasses.
Uma classe abstrata permite a declaração de métodos sem corpo (não possui código) que devem ser sobrescritos em uma subclasse.
O código abaixo cria a classe abstrata base_bonus. O método ApplyBonus() não tem corpo.
base_bonus := class<abstract>():
BonusId : int
Name : string
BonusValue: int
BonusData(): string =
"BonusId: {BonusId} | Name: {Name} | BonusValue: {BonusValue}"
ApplyBonus() : void
Não é possivel criar instâncias de uma classe abstrata. O código abaixo gera um erro de compilação.
BaseBonus : base_bonus = base_bonus{BonusValue := 20, Name := "Generic"}
O especificador <concrete> indica que todos os campos da classe tem de ter valores default permitindo a criação de instâncias com um arquétipo vazio.
O código abaixo cria a classe concreta score_bonus usando base_bonus como superclasse. Todos os campos receberam valores default e o método ApplyBonus() foi sobrescrito.
score_bonus := class<concrete>(base_bonus):
BonusId<override> : int = 2
Name<override> : string = "Score MEDIUM"
BonusValue<override>: int = 50
ApplyBonus<override>() : void =
Print("Adding {BonusValue} to SCORE.")
Este código cria uma instância de score_bonus usando um arquétipo vazio {}.
ScoreBonusDefault : score_bonus = score_bonus{}
O especificador <final> é usado para indicar que uma classe não pode ter subclasses. Este especificador também pode ser usado em campos e métodos para indicar que eles não podem ser sobrescritos.
O código abaixo cria a classe final time_bonus usando base_bonus como superclasse.
time_bonus := class<final>(base_bonus):
BonusId<override> : int = 1
ApplyBonus<override>() : void =
Print("Adding {BonusValue} to TIME.")
A nova classe time_bonus não pode ser usada como superclasse. O código a seguir gera um erro de compilação.
time_bonus_variation := class(time_bonus):
Vamos juntar estes exemplos em um único arquivo para poder testar no UEFN. Eu criei um dispositivo verse chamado class_specifiers_device e usei este código:
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
base_bonus := class<abstract>():
BonusId : int
Name : string
BonusValue: int
BonusData(): string =
"BonusId: {BonusId} | Name: {Name} | BonusValue: {BonusValue}"
ApplyBonus() : void
time_bonus := class<final>(base_bonus):
BonusId<override> : int = 1
ApplyBonus<override>() : void =
Print("Adding {BonusValue} to TIME.")
score_bonus := class<concrete>(base_bonus):
BonusId<override> : int = 2
Name<override> : string = "Score MEDIUM"
BonusValue<override>: int = 50
ApplyBonus<override>() : void =
Print("Adding {BonusValue} to SCORE.")
class_specifiers_device := class(creative_device):
TimeBonus : time_bonus = time_bonus{BonusValue := 30, Name := "Time MEDIUM"}
ScoreBonusDefault : score_bonus = score_bonus{}
OnBegin<override>()<suspends>:void=
Print( ScoreBonusDefault.BonusData() )
ScoreBonusDefault.ApplyBonus()
Este dispositivo Verse apenas executa os dois métodos da instância ScoreBonusDefault para escrever algumas mensagens no log. O dispositivo foi criado para ilustrar o uso dos especificadores de classe.