部分類別
部分類別可以把原本在同一個檔案中的Class的方法/屬性,
拆成不同的檔案來維護,
但對於編譯器來說這多個檔案仍舊是同一個類別.
要製作部分類別只要在class前加上partial即可:
File: A.cs
public partial class A : MonoBehaviour
{
void Update()
{
if (!_runOnce) // _runOnce是由另一個部分類別創建
{
_runOnce = true; // 但一樣可以在這邊取用(因為還是同一個類別)
Debug.Log("update");
}
}
}
File: A.part1.cs
public partial class A // 可以省略繼承MonoBehaviour
{
private bool _runOnce; // _runOnce在這邊維護唷~
void Start()
{
Debug.Log("start");
}
}
File: A.part2.cs
public partial class A : IDisposable // 可以分開實作介面
{
void Awake()
{
Debug.Log("awake");
}
public void Dispose()
{
Debug.Log("Dispose");
}
}
把A類別掛上GameObject並運行, Console輸出如下:
Form表應用
Form表自動轉檔會產生部分類別,
以[天梯#cross.xlsx]為例,
產生了:
- CrossTable.cs
- CrossTable.auto.cs
其中CrossTable.auto.cs由工具維護,
每次轉檔都會把CrossTable.auto.cs檔覆蓋重寫,
如果有自訂方法或屬性在裡面的話,
一旦轉檔就付之一炬了!
這時部分類別就可以派上用場,
任何自訂的方法跟屬性都寫在CrossTable.cs,
就不用擔心被工具覆蓋的問題!
註:CrossTable.cs只有在第一次Form表轉檔會產生,之後就自行維護了
public partial class CrossTable
{
/// <summary>
/// 自訂table屬性
/// </summary>
public float NextAverage
{
get
{
return Rows.Average(row => row.Next); // 可以取得部份類別中子類Row的屬性來使用
}
}
/// <summary>
/// 自訂table方法
/// </summary>
/// <returns></returns>
public float CalcNextAverage()
{
return Rows.Average(row => row.Next); // 同上, 就當做是同個類別操作就可以了
}
public partial class Row
{
/// <summary>
/// 自訂row屬性
/// </summary>
public string NameWithNext
{
get
{
return Name + Next;
}
}
/// <summary>
/// 自訂row方法
/// </summary>
/// <returns></returns>
public string GetNameWithNext()
{
return Name + Next;
}
}
}