C# 之 接口隔离原则讲解

接口隔离原则的解释如下:
客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。

下面我将举出两个例子来讲解这个原则特性是怎么样的 . . .

1)第一个例子是一个女人在街上开着小汽车,然后这个小汽车坏了,女人哭了非常伤心,她的男朋友安慰着她,说给她买一辆坦克开 . . .

首先,我们看下面的代码:

class Program
{
    static void Main(string[] args)
    {
        var girl = new GirlFriend(new Car());
        girl.Work();
    }
}

// 接口隔离原则
interface IVehicle
{
    void Run();
}

class Car : IVehicle
{
    public void Run()
    {
        Console.WriteLine("ci ci ci...");
    }
}

class GirlFriend
{
    private IVehicle _vehicle;
    public GirlFriend(IVehicle vehicle)
    {
        _vehicle = vehicle;
    }

    public void Work()
    {
        _vehicle.Run();
    }
}

interface ITank
{
    void Run();     // 开车
    void Fire();    // 开火
}

class LightTank : ITank
{
    public void Fire()
    {
        Console.WriteLine("bang! bang!...");
    }

    public void Run()
    {
        Console.WriteLine("ka! ka! ka!...");
    }
}

代码中,女人可以开着汽车,但是她无法开坦克,因为在她的类的定义中没有定义坦克,所以我们修改如下所示:

class Program
{
    static void Main(string[] args)
    {
        var girl = new GirlFriend(new LightTank());
        girl.Work();
    }
}
class GirlFriend
{
    private ITank _Tank;
    public GirlFriend(ITank Tank)
    {
        _Tank = Tank;
    }

    public void Work()
    {
        _Tank.Run();
    }
}

现在我们定义这个女人可以开坦克了,但是这样子这个女人又不能开小汽车了,而且我们发现这个坦克中的开火功能没有用到,确实如此,我们是不需要使用的,因为这个女人只是需要能开就行了,但是 LightTank这个类中已经定义了开火这个功能,这就违反了接口隔离原则,下面我重新设计一下,代码如下所示:

class Program
{
    static void Main(string[] args)
    {
        var girl = new GirlFriend(new LightTank());
        girl.Work();

    }
}

// 接口隔离原则
interface IVehicle
{
    void Run();
}

class Car : IVehicle
{
    public void Run()
    {
        Console.WriteLine("ci ci ci...");
    }
}

class GirlFriend
{
    private IVehicle _vehicle;
    public GirlFriend(ITank Vehicle)
    {
        _vehicle = Vehicle;
    }

    public void Work()
    {
        _vehicle.Run();
    }
}

interface IFire
{
    void Fire();
}

interface ITank : IVehicle, IFire
{

}

class LightTank : ITank
{
    public void Fire()
    {
        Console.WriteLine("bang! bang!...");
    }

    public void Run()
    {
        Console.WriteLine("ka! ka! ka!...");
    }
}

因为开火属于武器的范畴,所有我单独把武器给分开了,并且这个女人还是只会开车这个功能,这时,女朋友开着坦克只能走路了,没不能开火了,输出如下所示:

ka! ka! ka!..

.
.

2)使用显式接口完成接口隔离:
首先,我们定义下面的数据:

interface ILove
{
    void Love();
}
interface IKill
{
    void Kill();
}

class BadPerson : ILove, IKill
{
    public void Love()
    {
        Console.WriteLine("I Love You!...");
    }

    void IKill.Kill()
    {
        Console.WriteLine("I Will Kills You!!!");
    }
}

其中 Kill 方法为显式接口方法,这样我们就不能轻易的看出来有这个方法,如下所示:
在这里插入图片描述

我们发现,现在只有 Love方法,当这个人变为坏人时,他才会干掉敌人,如下所示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42100963/article/details/107598952