1. 程式人生 > 實用技巧 >c#之介面隔離

c#之介面隔離

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