依赖关系注入会导致不必要的实现



我正在创建一个实现IAnimal接口的Animal类。然后,类和类都实现IAnimal接口。目前,我在IAnimal中只保留了 3 个简单的方法进行简短演示。主类动物是使用依赖注入 (DI) 构造的。

IAnimal有更多的方法时,例如:Cats类只实现 SomethingOnlyCatsDo 方法,Dogs类实现SomethingOnlyDogsDo方法,那么每个类中都会有更多不必要的实现(如Cats()。CatchDisk()dogs()。当前示例中的 CatchMouse()。

我的问题是,有什么方法可以帮助我继续使用 DI 但避免这种不必要的实现的增长?

public interface IAnimal
{
void Sound();
void CatchMouse();
void CatchDisk();
// What if there are more methods here
//string GetOwnerName();
//void SomethingOnlyCatsDo();
//void SomethingOnlyDogsDo();
}
public class Cats : IAnimal
{
public void Sound()
{
Console.WriteLine("Meow meow");
}
public void CatchMouse()
{
Console.WriteLine("Catching mouse");
}
public void CatchDisk()
{
throw new NotImplementedException();
}
}
public class Dogs : IAnimal
{
public void Sound()
{
Console.WriteLine("Woof woof");
}
public void CatchDisk()
{
Console.WriteLine("Catching disk");
}
public void CatchMouse()
{
throw new NotImplementedException();
}
}
// Main class
public class Animals
{
private readonly IAnimal _animal;
public Animals(IAnimal animal)
{
_animal = animal;
}
public void Sound()
{
_animal.Sound();
}
public void CatchADisk()
{
_animal.CatchDisk();
}
public void CatchAMouse()
{
_animal.CatchMouse();
}
}

如果遵循SOLID原则,特别是I(接口隔离,https://en.wikipedia.org/wiki/Interface_segregation_principle),IAnimal不应该有CatchDiskCatchMouse的方法。相反,您应该使用Sound()方法进行IAnimal,并将接口ICatchesMouseICatchesDisk分开。这样,Animal就不必实现不必要的方法。

您可以使用接口隔离原则。

接口隔离原则 (ISP) 指出,不应强制任何客户端依赖于它不使用的方法。

您的IAnimal接口将只有Sound(),然后您创建一个名为ICat的新接口,该接口继承自IAnimal,并且该接口将具有CatchMouse()。您的类Cats将从ICat继承。

这是一个实际的例子。

最新更新