API Basic Class es - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
Class / New / Me / Property
ClassicUO • Basic
Class agrupa el estado y los métodos de cada objeto. New crea una referencia: asignarla a otra variable conserva el mismo objeto, a diferencia de una copia de Structure. Los ejemplos incluyen todos sus constructores, métodos y accesores.
Sintaxis exacta
[Public | Private] Class TypeName
[Public | Private | Dim] field As FieldType
Public Sub New([parameters]) ... End Sub
[Public | Private] Sub Method([parameters]) ... End Sub
[Public | Private] Function Method([parameters]) As ResultType ... End Function
[Public | Private] [ReadOnly | WriteOnly] Property Name[()] As ValueType
Get ... Return value / Name = value / Exit Property ... End Get
Set(ByVal value As ValueType) ... End Set
End Property
Public Property AutoName As ValueType
End Class
Dim instance [As TypeName] = New TypeName(arguments)
instance.Property = expression
value = instance.Property
instance.Method(arguments)
With instance ... End With
Parámetros
TypeName / Public / Private— TypeName es un nombre simple único a nivel de archivo o Module; fuera use ModuleName.TypeName. Class es Public por defecto; Private Class solo pertenece a su Module. No se implementan herencia, interfaces, genéricos, clases anidadas, Shared, sobrecargas, destructores ni declaraciones Event de instancia.field As FieldType / Me— Cada campo exige As Integer, Double, Boolean, String, Object o un Enum, Structure, Class declarado; también funcionan los alias Basic existentes. Los campos son Private por defecto; el acceso externo requiere Public explícito. Valores iniciales: números/Boolean 0, String vacío, Structure con campos cero, Object/Class Nothing (Unit). Inicialice otros valores en Sub New. Me identifica la instancia y no puede reasignarse/redeclararse; los nombres locales pueden ocultar otros miembros.New / Sub New— New TypeName(arguments) crea campos independientes y ejecuta Public Sub New una vez. Sin constructor solo admite New TypeName(). Hay un constructor; Optional, valores predeterminados y argumentos nombrados siguen las reglas normales. Los argumentos se evalúan una vez en orden de escritura; un error impide devolver el objeto creado. As TypeName sin New conserva Nothing.Sub / Function / arguments— Sub/Function se invocan como instance.Method(...); dentro de la clase también Method(...)/Me.Method(...). Private solo permite acceso desde esa Class, incluso a otra instancia del mismo tipo. Se admiten tipos, ByVal/ByRef, Optional, ParamArray y argumentos nombrados, pero no elementos nombrados de ParamArray. Function devuelve su tipo; Sub Unit. TypeName.Method(...) e instance.New(...) no son válidos; AddressOf requiere un procedimiento envolvente de archivo/módulo.Property / Get / Set— Property Name[()] As ValueType no admite índices. Lea instance.Name sin paréntesis. Get devuelve Return o lo asignado a Name; Exit Property devuelve ese resultado/valor predeterminado. La asignación invoca Set(ByVal value As ValueType) sin leer el Get final. La propiedad ordinaria requiere un Get y un Set. Declare visibilidad en Property; Set exige un parámetro ByVal explícito del mismo tipo.ReadOnly / WriteOnly / auto Property— ReadOnly con cuerpo contiene solo Get; WriteOnly solo Set. El acceso prohibido provoca un error capturable. Una propiedad automática almacena sin Get/Set ni End Property; su versión ReadOnly solo puede asignarse en Sub New de esa instancia. WriteOnly sin Set no es válido. Una propiedad ReadOnly que devuelve Class permite cambiar los miembros mutables del objeto devuelto.ByVal / ByRef / With— ByVal copia la referencia: los cambios de miembros afectan al original, reemplazar el parámetro no reemplaza la variable del llamador. ByRef copia de vuelta también una referencia nueva conforme a copy-in/copy-out. La igualdad compara identidad. With instance captura el objeto una vez y admite campos, propiedades y métodos. Class no es IDisposable automáticamente; Using se aplica a los recursos admitidos.
Devuelve
New devuelve Object con referencia Class, no ID/gráfico UO. Get y Function devuelven el tipo declarado; Set, Sub y declaraciones Unit. Sin New: Nothing. La igualdad de referencias y As Boolean usan 1/True o 0/False; las cantidades Integer no indican automáticamente éxito. Main devuelve "5:2:1", "1:0:6", "ore:1:replacement:0".
Comportamiento
- SC032 rechaza declaraciones incorrectas antes de ejecutar, incluso sin Option Explicit. Límites: 256 clases, 256 campos/propiedades y 256 métodos por clase; 32 llamadas anidadas contando New/Get/Set. Rutas de asignación/ByRef: 64 componentes. Se permiten ciclos de referencias; metadatos/valores iniciales se preparan y cada New recibe almacenamiento mutable independiente.
- La ruta del receptor se captura antes del lado derecho/argumentos; cada Get de la ruta se evalúa una vez. La copia de vuelta conserva el destino inicial aunque un procedimiento sustituya una variable intermedia. El valor se convierte al tipo declarado. Try/Catch captura errores de constructor, métodos y accesores; no revierte cambios previos.
- Pausa, parada, líneas y límite de profundidad usan los marcos normales del script. Cerrar IDE no detiene el script. El inspector muestra tipo/cantidad de miembros sin Get ni recorrer ciclos. Watch lee campos/propiedades automáticas, pero no ejecuta Get personalizados, métodos ni constructores. Es el subconjunto descrito, no clases .NET arbitrarias.
Ejemplos
1. Objetos independientes y referencia compartida
# New Counter(label:="ore", start:=2) recibe String label e Integer start y establece Label/stored. second tiene campos separados; alias=first copia una referencia. Add(amount:=3) escribe mediante Value.Set, comprueba negativos y devuelve Integer desde Value.Get. first queda en 5, second en 2 y alias=first es 1/True. Todos los métodos están incluidos.
Option Explicit On
Class Counter
Private stored As Integer
Public Property Label As String
Public Sub New(ByVal label As String, ByVal start As Integer)
Me.Label = label
stored = start
End Sub
Public Property Value As Integer
Get
Return stored
End Get
Set(ByVal value As Integer)
If value < 0 Then
Throw "Value must be non-negative"
End If
stored = value
End Set
End Property
Public Function Add(ByVal amount As Integer) As Integer
Me.Value = stored + amount
Return Me.Value
End Function
End Class
Sub Main()
Dim first = New Counter(label:="ore", start:=2)
Dim second = New Counter("wood", 2)
Dim alias = first
alias.Add(amount:=3)
Return CStr(first.Value) & ":" & CStr(second.Value) & ":" & CStr(alias = first)
End Sub
Explicación de los parámetros y la ejecución:
New Counter(label:="ore", start:=2) recibe String label e Integer start y establece Label/stored. second tiene campos separados; alias=first copia una referencia. Add(amount:=3) escribe mediante Value.Set, comprueba negativos y devuelve Integer desde Value.Get. first queda en 5, second en 2 y alias=first es 1/True. Todos los métodos están incluidos.
2. Lectura, escritura y Boolean
# Limit=10 llama a Set con value=10. Remaining.Get asigna el nombre de resultado y usa Exit Property. TrySpend(cost:=4) resta cuatro y devuelve 1/True; cost=9 supera los seis restantes y devuelve 0/False. Limit=-3 lanza antes de modificar; Catch lee Remaining=6. Main produce "1:0:6" sin acciones de servidor.
Option Explicit On
Class Budget
Private amount As Integer
Public ReadOnly Property Remaining() As Integer
Get
Remaining = amount
Exit Property
End Get
End Property
Public WriteOnly Property Limit As Integer
Set(ByVal value As Integer)
If value < 0 Then
Throw "Limit must be non-negative"
End If
amount = value
End Set
End Property
Public Function TrySpend(ByVal cost As Integer) As Boolean
If cost < 0 Then
Throw "cost must be non-negative"
End If
If cost > amount Then
Return False
End If
amount -= cost
Return True
End Function
End Class
Sub Main()
Dim budget = New Budget()
budget.Limit = 10
Dim paid = budget.TrySpend(4)
Dim refused = budget.TrySpend(9)
Try
budget.Limit = -3
Catch problem
Return CStr(paid) & ":" & CStr(refused) & ":" & CStr(budget.Remaining)
End Try
Return "unexpected"
End Sub
Explicación de los parámetros y la ejecución:
Limit=10 llama a Set con value=10. Remaining.Get asigna el nombre de resultado y usa Exit Property. TrySpend(cost:=4) resta cuatro y devuelve 1/True; cost=9 supera los seis restantes y devuelve 0/False. Limit=-3 lanza antes de modificar; Catch lee Remaining=6. Main produce "1:0:6" sin acciones de servidor.
3. Module, ByVal y reemplazo ByRef
# Jobs.WorkItem(name) guarda String Name y Done empieza en cero. Tick(ByVal job) incrementa el Done compartido a 1, pero su reemplazo por "local" solo es local. Replace(ByRef job, ByVal name) crea "replacement" y copia la referencia al llamador; los argumentos nombrados se escriben al revés intencionalmente. original sigue "ore"/1, job es "replacement"/0. Module Jobs aparece completo.
Option Explicit On
Module Jobs
Public Class WorkItem
Public Property Name As String
Public Done As Integer
Public Sub New(ByVal name As String)
Me.Name = name
End Sub
End Class
Public Sub Tick(ByVal job As WorkItem)
job.Done += 1
job = New WorkItem("local")
End Sub
Public Sub Replace(ByRef job As WorkItem, ByVal name As String)
job = New WorkItem(name)
End Sub
End Module
Sub Main()
Dim job As Jobs.WorkItem = New Jobs.WorkItem("ore")
Dim original = job
Jobs.Tick(job)
Jobs.Replace(name:="replacement", job:=job)
Return original.Name & ":" & CStr(original.Done) & ":" & job.Name & ":" & CStr(job.Done)
End Sub
Explicación de los parámetros y la ejecución:
Jobs.WorkItem(name) guarda String Name y Done empieza en cero. Tick(ByVal job) incrementa el Done compartido a 1, pero su reemplazo por "local" solo es local. Replace(ByRef job, ByVal name) crea "replacement" y copia la referencia al llamador; los argumentos nombrados se escriben al revés intencionalmente. original sigue "ore"/1, job es "replacement"/0. Module Jobs aparece completo.
Funciones internas: de la llamada al resultado
Class agrupa el estado y los métodos de cada objeto. New crea una referencia: asignarla a otra variable conserva el mismo objeto, a diferencia de una copia de Structure. Los ejemplos incluyen todos sus constructores, métodos y accesores.
1. ClassCatalog.Build / Complete
SC032 rechaza declaraciones incorrectas antes de ejecutar, incluso sin Option Explicit. Límites: 256 clases, 256 campos/propiedades y 256 métodos por clase; 32 llamadas anidadas contando New/Get/Set. Rutas de asignación/ByRef: 64 componentes. Se permiten ciclos de referencias; metadatos/valores iniciales se preparan y cada New recibe almacenamiento mutable independiente.
declarations -> unique typed members -> accessor validation -> prepared metadata; SC032 on invalid Class
Código del proyecto: external/InjectionScript/src/InjectionScript/Runtime/ClassCatalog.cs; función ClassCatalog.Build / Complete.
2. ConstructClass
New TypeName(arguments) crea campos independientes y ejecuta Public Sub New una vez. Sin constructor solo admite New TypeName(). Hay un constructor; Optional, valores predeterminados y argumentos nombrados siguen las reglas normales. Los argumentos se evalúan una vez en orden de escritura; un error impide devolver el objeto creado. As TypeName sin New conserva Nothing.
new instance -> independent field slots -> bind constructor arguments -> Sub New -> Object reference
Código del proyecto: external/InjectionScript/src/InjectionScript/Runtime/Interpreter.Classes.cs; función ConstructClass.
3. ClassObject.Member / Read
Property Name[()] As ValueType no admite índices. Lea instance.Name sin paréntesis. Get devuelve Return o lo asignado a Name; Exit Property devuelve ese resultado/valor predeterminado. La asignación invoca Set(ByVal value As ValueType) sin leer el Get final. La propiedad ordinaria requiere un Get y un Set. Declare visibilidad en Property; Set exige un parámetro ByVal explícito del mismo tipo.
check member visibility -> stored value OR Get frame -> declared value type
Código del proyecto: external/InjectionScript/src/InjectionScript/Runtime/ObjectTypes/ClassObject.cs; función ClassObject.Member / Read.
4. MemberAccess.Resolve / ClassObject.Write
La ruta del receptor se captura antes del lado derecho/argumentos; cada Get de la ruta se evalúa una vez. La copia de vuelta conserva el destino inicial aunque un procedimiento sustituya una variable intermedia. El valor se convierte al tipo declarado. Try/Catch captura errores de constructor, métodos y accesores; no revierte cambios previos.
capture receiver once -> evaluate RHS/arguments -> coerce value -> Set OR stored slot
Código del proyecto: external/InjectionScript/src/InjectionScript/Runtime/MemberAccess.cs; función MemberAccess.Resolve / ClassObject.Write.
5. CallClassMethod / CallSubrutine
Sub/Function se invocan como instance.Method(...); dentro de la clase también Method(...)/Me.Method(...). Private solo permite acceso desde esa Class, incluso a otra instancia del mismo tipo. Se admiten tipos, ByVal/ByRef, Optional, ParamArray y argumentos nombrados, pero no elementos nombrados de ParamArray. Function devuelve su tipo; Sub Unit. TypeName.Method(...) e instance.New(...) no son válidos; AddressOf requiere un procedimiento envolvente de archivo/módulo.
check method visibility -> bind named/positional arguments -> Me frame -> return -> ByRef copy-out
Código del proyecto: external/InjectionScript/src/InjectionScript/Runtime/Interpreter.Classes.cs; función CallClassMethod / CallSubrutine.
6. ClassObject.DisplayValue
Pausa, parada, líneas y límite de profundidad usan los marcos normales del script. Cerrar IDE no detiene el script. El inspector muestra tipo/cantidad de miembros sin Get ni recorrer ciclos. Watch lee campos/propiedades automáticas, pero no ejecuta Get personalizados, métodos ni constructores. Es el subconjunto descrito, no clases .NET arbitrarias.
debugger: type + member count; no getter calls and no traversal of reference cycles
Código del proyecto: external/InjectionScript/src/InjectionScript/Runtime/ObjectTypes/ClassObject.cs; función ClassObject.DisplayValue.
New devuelve Object con referencia Class, no ID/gráfico UO. Get y Function devuelven el tipo declarado; Set, Sub y declaraciones Unit. Sin New: Nothing. La igualdad de referencias y As Boolean usan 1/True o 0/False; las cantidades Integer no indican automáticamente éxito. Main devuelve "5:2:1", "1:0:6", "ore:1:replacement:0".