技術上可行:透過委派或反射可存取呼叫者私有欄位,但嚴重違反封裝原則,極易導致維護災難。
| 場景 | 推薦模式 |
|---|---|
| 需修改呼叫者狀態 | 傳遞 介面 或 可變物件 (ByRef 參數、類實例) |
| 需讀取呼叫者資料 | 傳遞 必要參數 (ByVal) 或 資料傳輸物件 (DTO) |
| 回呼/事件通知 | 定義 事件/委派,呼叫者訂閱並自行處理內部邏輯 |
| 跨層共享狀態 | 使用 共用服務/Context 物件 依賴注入 |
' 定義委派型別
Public Delegate Sub UpdateUICallback(message As String)
' 被呼叫者接受委派
Public Sub DoWork(callback As UpdateUICallback)
' ... 工作邏輯 ...
callback("進度 50%") ' 呼叫者決定如何處理訊息
End Sub
' 呼叫者
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim worker As New Worker()
worker.DoWork(AddressOf Me.HandleUpdate) ' 傳遞自身方法
End Sub
Private Sub HandleUpdate(msg As String)
Me.Label1.Text = msg ' 呼叫者自主更新私有 UI 元件
End Sub
請拋棄「存取呼叫者私有變數」的念頭,改用參數傳遞、介面契約、事件回呼等標準解耦手段。