1.擴展方法:
擴展方法允許向現有類型 “添加” 方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。擴展方法是一種特殊的靜態方法,但可以像實例方法一樣進行調用。
使用場景:
1.當無法修改某個類的源代碼,但又希望為該類添加一些實用方法時,擴展方法就非常有用。
2.為第三方庫中的類型添加額外的功能。
實現:
1.基礎實現:
public class ExtensionTest : MonoBehaviour
{void Start(){MyClass obj = new MyClass(5);// 可以像調用實例方法一樣調用擴展方法int result = obj.DoubleValue();Debug.Log($"Double value: {result}");}
}// 定義一個簡單的類
public class MyClass
{public int Value { get; set; }public MyClass(int value){Value = value;}
}// 擴展方法必須定義在靜態類中
public static class MyClassExtensions
{// 擴展方法必須是靜態方法,且第一個參數使用 this 關鍵字指定要擴展的類型public static int DoubleValue(this MyClass myClass){return myClass.Value * 2;}
}
?結果:
2.鏈式擴展:
public class ExtensionTest : MonoBehaviour
{void Start(){Person person = new Person("John", 25);// 鏈式調用擴展方法person.SetName("Alice").SetAge(30).PrintInfo();}
}// 定義一個簡單的類
public class Person
{public string Name { get; set; }public int Age { get; set; }public Person(string name, int age){Name = name;Age = age;}public void PrintInfo(){Debug.Log($"Name: {Name}, Age: {Age}");}
}// 擴展方法類
public static class PersonExtensions
{// 擴展方法:設置姓名public static Person SetName(this Person person, string name){person.Name = name;return person;}// 擴展方法:設置年齡public static Person SetAge(this Person person, int age){person.Age = age;return person;}
}
結果:
?
2.鉤子機制:
在 C# 中,鉤子通常指的是在程序執行過程中預留的一些 “可插入點”,允許開發者在特定的時機插入自定義的邏輯。常見的實現方式有事件(Event)、抽象方法、委托等
使用場景:
1.當你需要在某個操作的前后執行自定義邏輯時,可以使用鉤子。
2.實現插件化架構,允許開發者在系統的某些關鍵位置插入自定義的功能。
實現:
1.虛方法鉤子:基類定義一個虛方法,該方法可以包含默認的實現邏輯,也可以為空。派生類重寫這個虛方法,在其中添加自定義的邏輯。基類在執行某個算法時,會調用這個虛方法,這樣派生類就可以在這個 “鉤子點” 上插入自己的代碼。
public class HookTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){// 創建魔法師角色GameCharacter mage = new Mage();mage.Attack();Console.WriteLine();// 創建戰士角色GameCharacter warrior = new Warrior();warrior.Attack();}
}public class HookTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){// 創建魔法師角色GameCharacter mage = new Mage();mage.Attack();Console.WriteLine();// 創建戰士角色GameCharacter warrior = new Warrior();warrior.Attack();}
}// 基類:游戲角色
public class GameCharacter
{// 虛方法,作為鉤子public virtual void SpecialAbility(){Debug.Log("No special ability.");}// 角色的攻擊方法,會調用鉤子方法public void Attack(){Debug.Log("Character attacks!");SpecialAbility();}
}// 派生類:魔法師
public class Mage : GameCharacter
{// 重寫虛方法,添加自定義邏輯public override void SpecialAbility(){Debug.Log("Mage casts a fireball!");}
}// 派生類:戰士
public class Warrior : GameCharacter
{// 重寫虛方法,添加自定義邏輯public override void SpecialAbility(){Debug.Log("Warrior uses a powerful shield bash!");}
}
結果:
2.事件鉤子?:
public class HookTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){MyProcessor processor = new MyProcessor();// 訂閱事件,插入自定義邏輯processor.BeforeProcess += (sender, e) =>{Debug.Log("Before process: Custom logic executed.");};processor.AfterProcess += (sender, e) =>{Debug.Log("After process: Custom logic executed.");};processor.Process();}
}// 定義一個包含鉤子的類
public class MyProcessor
{// 定義事件,作為鉤子public event EventHandler BeforeProcess;public event EventHandler AfterProcess;public void Process(){// 在處理前觸發事件BeforeProcess?.Invoke(this, EventArgs.Empty);Debug.Log("Processing...");// 在處理后觸發事件AfterProcess?.Invoke(this, EventArgs.Empty);}
}
結果:
總結:
通過合理使用擴展方法和鉤子方法,可以在保持外觀模式簡潔性的同時,提供強大的擴展能力。
1.擴展方法??適合添加??橫向功能??(如日志、監控)。
?2.?虛方法鉤子??適合調整??核心流程??。
??3.事件機制??適合實現??觀察者模式??的松散耦合。
4.優先選擇??組合??而非多層繼承。