我正在创建一个实现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
不应该有CatchDisk
或CatchMouse
的方法。相反,您应该使用Sound()
方法进行IAnimal
,并将接口ICatchesMouse
和ICatchesDisk
分开。这样,Animal
就不必实现不必要的方法。
您可以使用接口隔离原则。
接口隔离原则 (ISP) 指出,不应强制任何客户端依赖于它不使用的方法。
您的IAnimal
接口将只有Sound()
,然后您创建一个名为ICat
的新接口,该接口继承自IAnimal
,并且该接口将具有CatchMouse()
。您的类Cats
将从ICat
继承。
这是一个实际的例子。