API Basic Class ja - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

Class / New / Me / Property

ClassicUO • Basic

Class は各オブジェクトの状態とスクリプトのメソッドをまとめます。New が作るのは参照オブジェクトです。別の変数への代入は同じオブジェクトを参照し、Structure の値コピーとは異なります。使用するコンストラクター、メソッド、プロパティの全コードを例に示します。

正確な構文

[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

パラメーター

  • TypeName / Public / Private — TypeName はファイルまたは Module レベルの一意な単純名です。モジュール外では ModuleName.TypeName を使います。Class の既定は Public、Private Class は同じ Module 内専用です。継承、インターフェイス、ジェネリック、入れ子クラス、Shared、オーバーロード、デストラクター、インスタンス Event 宣言は未実装です。
  • field As FieldType / Me — フィールドには As Integer、Double、Boolean、String、Object、宣言済み Enum/Structure/Class の型を指定します。既存の Basic 型別名も有効です。フィールドの既定は Private、外部公開には Public が必要です。初期値は数値/Boolean が 0、String が空、Structure がゼロ値、Object/Class が Nothing (Unit) です。他の初期化は Sub New で行います。Me は現在のインスタンスで再宣言・再代入できません。引数やローカル変数は他のメンバー名を隠せます。
  • New / Sub New — New TypeName(arguments) は独立したフィールドを作り、Public Sub New を一度実行します。コンストラクターがなければ New TypeName() のみ有効です。コンストラクターは一つで、通常の Optional、既定引数、名前付き引数の規則を使えます。引数は記述順に一度評価され、失敗時には構築済みオブジェクトを返しません。As TypeName だけの変数は Nothing のままです。
  • Sub / Function / arguments — Sub/Function は instance.Method(...)、クラス内では Method(...) または Me.Method(...) で呼びます。Private は同じ Class のコードからのみ呼べ、同型の別インスタンスにも適用されます。型、ByVal/ByRef、Optional、ParamArray、名前付き引数を利用できますが、ParamArray 要素の名前付き指定は不可です。Function は宣言型、Sub は Unit を返します。TypeName.Method(...) と instance.New(...) は無効です。インスタンスメソッドの AddressOf にはファイル/モジュールのラッパー手続きが必要です。
  • Property / Get / Set — Property Name[()] As ValueType はインデックス引数を持ちません。読み取りは呼び出し括弧なしの instance.Name です。Get は Return または Name への代入で返し、Exit Property はその値または型の既定値を返します。代入は Set(ByVal value As ValueType) を呼び、末尾の Get は読みません。通常のプロパティは Get と Set が一つずつ必要です。公開範囲は Property に指定し、Set には同型の明示的な ByVal 引数を一つ指定します。
  • ReadOnly / WriteOnly / auto Property — 本体付き ReadOnly は Get のみ、WriteOnly は Set のみです。禁止された読み書きは捕捉可能なエラーです。自動プロパティは Get/Set と End Property を持たず値を直接保存します。自動 ReadOnly への代入はそのインスタンスの Sub New 内だけです。Set のない WriteOnly は無効です。ReadOnly が Class 参照を返す場合、その参照先の変更可能なメンバーは変更できます。
  • ByVal / ByRef / With — ByVal は参照をコピーします。メンバー変更は元のオブジェクトに反映されますが、引数自体の置換は呼び出し元変数を置換しません。ByRef はエンジンの copy-in/copy-out 規則で新しい参照も書き戻します。等価比較はオブジェクトの同一性です。With instance は対象を一度保持してフィールド、プロパティ、メソッドを扱います。Class は自動的に IDisposable にはなりません。Using は対応するリソースオブジェクトに使ってください。

戻り値

New は Class 参照を含む Object を返し、UO の ID/グラフィックではありません。Get と Function は宣言型、Set・Sub・宣言は Unit です。New なしの変数は Nothing です。参照比較と As Boolean は 1/True または 0/False、Integer の数量は自動的な成功フラグではありません。Main の結果は "5:2:1"、"1:0:6"、"ore:1:replacement:0" です。

動作

  • SC032 は Option Explicit がなくても不正な宣言を実行前に拒否します。上限は 256 クラス、各 256 フィールド/プロパティと 256 メソッド、New/Get/Set を含む 32 段の呼び出しです。代入/ByRef のメンバーパスは 64 要素まで。循環参照は可能です。メタデータと既定値は事前準備し、可変の格納場所は New ごとに独立します。
  • 対象パスは右辺や引数の副作用より先に確定し、パス中の各 Get は一度だけ評価します。手続きが途中の変数を置換しても書き戻し先は元の対象です。値は宣言型に変換されます。コンストラクター、メソッド、アクセサーのエラーは Try/Catch で扱い、すでに行った変更は取り消しません。
  • 一時停止、停止、ソース位置、深さ制限は通常のスクリプトフレームを利用します。IDE を閉じるだけでは停止しません。インスペクターは Get や循環参照の追跡なしで型とメンバー数を表示します。Watch は保存フィールド/自動プロパティを読めますが、独自 Get、メソッド、New は実行できません。任意の .NET クラスではなく、ここに記載した機能範囲です。

使用例

1. 独立オブジェクトと参照共有

# New Counter(label:="ore", start:=2) は String label と Integer start を渡し、Label/stored を設定します。second は独立したフィールドを持ち、alias=first は参照コピーです。Add(amount:=3) は Value.Set で負数を検査して書き、Value.Get の Integer を返します。first は 5、second は 2、alias=first は 1/True です。補助メソッドもすべて掲載しています。
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

パラメーターと実行の説明:

New Counter(label:="ore", start:=2) は String label と Integer start を渡し、Label/stored を設定します。second は独立したフィールドを持ち、alias=first は参照コピーです。Add(amount:=3) は Value.Set で負数を検査して書き、Value.Get の Integer を返します。first は 5、second は 2、alias=first は 1/True です。補助メソッドもすべて掲載しています。

2. 読み取り・書き込みと Boolean

# Limit=10 は value=10 で Set を実行します。Remaining.Get は結果名へ代入して Exit Property で戻ります。TrySpend(cost:=4) は四つ減らし 1/True、cost=9 は残り六つを超えるので 0/False です。Limit=-3 は書き込み前に失敗し、Catch は Remaining=6 を読みます。Main は "1:0:6"。サーバー操作はありません。
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

パラメーターと実行の説明:

Limit=10 は value=10 で Set を実行します。Remaining.Get は結果名へ代入して Exit Property で戻ります。TrySpend(cost:=4) は四つ減らし 1/True、cost=9 は残り六つを超えるので 0/False です。Limit=-3 は書き込み前に失敗し、Catch は Remaining=6 を読みます。Main は "1:0:6"。サーバー操作はありません。

3. Module、ByVal、ByRef の置換

# Jobs.WorkItem(name) は String Name を保存し、Done の初期値は 0 です。Tick(ByVal job) は共有オブジェクトの Done を 1 にし、次の "local" への置換はローカル引数だけです。Replace(ByRef job, ByVal name) は "replacement" を作り呼び出し元へ参照を書き戻します。名前付き引数は意図的に逆順です。original は "ore"/1、job は新しい "replacement"/0。Module Jobs 全体を示しています。
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

パラメーターと実行の説明:

Jobs.WorkItem(name) は String Name を保存し、Done の初期値は 0 です。Tick(ByVal job) は共有オブジェクトの Done を 1 にし、次の "local" への置換はローカル引数だけです。Replace(ByRef job, ByVal name) は "replacement" を作り呼び出し元へ参照を書き戻します。名前付き引数は意図的に逆順です。original は "ore"/1、job は新しい "replacement"/0。Module Jobs 全体を示しています。

内部関数:呼び出しから結果まで

Class は各オブジェクトの状態とスクリプトのメソッドをまとめます。New が作るのは参照オブジェクトです。別の変数への代入は同じオブジェクトを参照し、Structure の値コピーとは異なります。使用するコンストラクター、メソッド、プロパティの全コードを例に示します。

1. ClassCatalog.Build / Complete

SC032 は Option Explicit がなくても不正な宣言を実行前に拒否します。上限は 256 クラス、各 256 フィールド/プロパティと 256 メソッド、New/Get/Set を含む 32 段の呼び出しです。代入/ByRef のメンバーパスは 64 要素まで。循環参照は可能です。メタデータと既定値は事前準備し、可変の格納場所は New ごとに独立します。

declarations -> unique typed members -> accessor validation -> prepared metadata; SC032 on invalid Class

プロジェクトのソース: external/InjectionScript/src/InjectionScript/Runtime/ClassCatalog.cs; 関数 ClassCatalog.Build / Complete.

2. ConstructClass

New TypeName(arguments) は独立したフィールドを作り、Public Sub New を一度実行します。コンストラクターがなければ New TypeName() のみ有効です。コンストラクターは一つで、通常の Optional、既定引数、名前付き引数の規則を使えます。引数は記述順に一度評価され、失敗時には構築済みオブジェクトを返しません。As TypeName だけの変数は Nothing のままです。

new instance -> independent field slots -> bind constructor arguments -> Sub New -> Object reference

プロジェクトのソース: external/InjectionScript/src/InjectionScript/Runtime/Interpreter.Classes.cs; 関数 ConstructClass.

3. ClassObject.Member / Read

Property Name[()] As ValueType はインデックス引数を持ちません。読み取りは呼び出し括弧なしの instance.Name です。Get は Return または Name への代入で返し、Exit Property はその値または型の既定値を返します。代入は Set(ByVal value As ValueType) を呼び、末尾の Get は読みません。通常のプロパティは Get と Set が一つずつ必要です。公開範囲は Property に指定し、Set には同型の明示的な ByVal 引数を一つ指定します。

check member visibility -> stored value OR Get frame -> declared value type

プロジェクトのソース: external/InjectionScript/src/InjectionScript/Runtime/ObjectTypes/ClassObject.cs; 関数 ClassObject.Member / Read.

4. MemberAccess.Resolve / ClassObject.Write

対象パスは右辺や引数の副作用より先に確定し、パス中の各 Get は一度だけ評価します。手続きが途中の変数を置換しても書き戻し先は元の対象です。値は宣言型に変換されます。コンストラクター、メソッド、アクセサーのエラーは Try/Catch で扱い、すでに行った変更は取り消しません。

capture receiver once -> evaluate RHS/arguments -> coerce value -> Set OR stored slot

プロジェクトのソース: external/InjectionScript/src/InjectionScript/Runtime/MemberAccess.cs; 関数 MemberAccess.Resolve / ClassObject.Write.

5. CallClassMethod / CallSubrutine

Sub/Function は instance.Method(...)、クラス内では Method(...) または Me.Method(...) で呼びます。Private は同じ Class のコードからのみ呼べ、同型の別インスタンスにも適用されます。型、ByVal/ByRef、Optional、ParamArray、名前付き引数を利用できますが、ParamArray 要素の名前付き指定は不可です。Function は宣言型、Sub は Unit を返します。TypeName.Method(...) と instance.New(...) は無効です。インスタンスメソッドの AddressOf にはファイル/モジュールのラッパー手続きが必要です。

check method visibility -> bind named/positional arguments -> Me frame -> return -> ByRef copy-out

プロジェクトのソース: external/InjectionScript/src/InjectionScript/Runtime/Interpreter.Classes.cs; 関数 CallClassMethod / CallSubrutine.

6. ClassObject.DisplayValue

一時停止、停止、ソース位置、深さ制限は通常のスクリプトフレームを利用します。IDE を閉じるだけでは停止しません。インスペクターは Get や循環参照の追跡なしで型とメンバー数を表示します。Watch は保存フィールド/自動プロパティを読めますが、独自 Get、メソッド、New は実行できません。任意の .NET クラスではなく、ここに記載した機能範囲です。

debugger: type + member count; no getter calls and no traversal of reference cycles

プロジェクトのソース: external/InjectionScript/src/InjectionScript/Runtime/ObjectTypes/ClassObject.cs; 関数 ClassObject.DisplayValue.

New は Class 参照を含む Object を返し、UO の ID/グラフィックではありません。Get と Function は宣言型、Set・Sub・宣言は Unit です。New なしの変数は Nothing です。参照比較と As Boolean は 1/True または 0/False、Integer の数量は自動的な成功フラグではありません。Main の結果は "5:2:1"、"1:0:6"、"ore:1:replacement:0" です。


en · ru · uk · fr · de · it · es · zh-tw · ja · ko

Basic