c#之介面隔離
阿新 • • 發佈:2020-08-02
1.原則
首先不應該強行要求客戶端依賴於它們不用的介面;其次是類之間的依賴應該建立在最小的介面上面。簡單點說,客戶端需要什麼功能,就提供什麼介面,對於客戶端不需要的介面不應該強行要求其依賴;類之間的依賴應該建立在最小的介面上面,這裡最小的粒度取決於單一職責原則的劃分。
(1)比如一個人能開車和坦克,它只是一個駕駛員,但是坦克還有武器系統,駕駛員是不能夠有武器許可權的,所以按照介面隔離原則按照下面的方式進行編寫
namespace TestClass { class Program { static void Main(string[] args) {var driver = new Driver(new LightTank()); driver.Run(); Console.ReadKey(); } } interface IVehicle { void Run(); } /// <summary> /// 汽車 /// </summary> class Car : IVehicle { public void Run() { Console.WriteLine("Car is running"); } } /// <summary> /// 卡車 /// </summary> class Truck : IVehicle { public void Run() { Console.WriteLine("Truck is running"); } } /// <summary> /// 坦克 /// c#中類或者介面可以繼承多介面,但是不能繼承多基類。 /// /// </summary>interface IItank:IVehicle,IWeapon { } class LightTank : IItank { public void Fire() { Console.WriteLine("LightTank is firing"); } public void Run() { Console.WriteLine("LightTank is running"); } } class HeavyTank : IItank { public void Fire() { Console.WriteLine("HeavyTank is firing"); } public void Run() { Console.WriteLine("HeavyTank is running"); } } /// <summary> /// 駕駛員類 /// </summary> class Driver { private IVehicle vehicle; public Driver(IVehicle vehicle) { this.vehicle = vehicle; } public void Run() { vehicle.Run(); } } interface IWeapon { void Fire(); } }
(2)顯式介面實現
能夠把一些隔離出來的介面隱藏起來,直到顯式的引用這個介面,才能使用介面中的方法。就比如人有2面性,一面隱藏起來,一面展示給眾人。
下面以這個殺手不太冷為例,主角一面是溫文爾雅,一面是冷酷無情
namespace TestClass { class Program { static void Main(string[] args) { var warm = new WarmKiller(); warm.Kill(); warm.Love(); Console.ReadKey(); } } interface IGentlement { void Love(); } interface IKiller { void Kill(); } /// <summary> /// 正常的方式實現介面 /// </summary> class WarmKiller : IGentlement, IKiller { public void Kill() { Console.WriteLine("Kill"); } public void Love() { Console.WriteLine("Love"); } } }
看上面的程式碼是沒問題的,但是在設計上是有問題的。因為一個人有兩面性,這是不會輕易讓人看出來另一面的。在程式設計的角度講,如果一個介面不想輕易的讓別人呼叫,就需要使用顯式介面。如下:
namespace TestClass { class Program { static void Main(string[] args) { //呼叫顯示介面方法 IKiller killer = new WarmKiller(); //此時killer只會呼叫kill方法,不會呼叫love方法 killer.Kill(); var wk = (IGentlement)killer; wk.Love(); Console.ReadKey(); } } interface IGentlement { void Love(); } interface IKiller { void Kill(); } /// <summary> /// 正常的方式實現介面 /// </summary> class WarmKiller : IGentlement, IKiller { void IKiller.Kill() { Console.WriteLine("Kill"); } public void Love() { Console.WriteLine("Love"); } } }
引於:https://www.bilibili.com/video/BV13b411b7Ht?t=1996&p=29