接口隔离原则的解释如下:
客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。
下面我将举出两个例子来讲解这个原则特性是怎么样的 . . .
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方法,当这个人变为坏人时,他才会干掉敌人,如下所示: