部分類別

部分類別可以把原本在同一個檔案中的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;
        }
    }
}

results matching ""

    No results matching ""