我正在创建一个实现 IAnimal 接口的 Animal 类。然后, Cats 和 Dogs 类都实现了 IAnimal 接口。目前,我在 IAnimal 中仅保留3个简单的方法进行简短演示。主要类 Animals 是使用依赖注入(DI)构造的。
当 IAnimal 具有更多方法时,例如: Cats 类仅实现 SomethingOnlyCatsDo 方法, Dogs 类实现 SomethingOnlyDogsDo 方法,那么每个这些类中都会有更多不必要的实现(例如 Cats()。CatchDisk()或 Dogs()。CatchMouse()< / em>(在当前示例中)。
我的问题是,有什么方法可以帮助我继续使用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();
}
}
答案 0 :(得分:3)
如果遵循SOLID原则,尤其是I(接口隔离,https://en.wikipedia.org/wiki/Interface_segregation_principle),则IAnimal
不应具有CatchDisk
或CatchMouse
方法。相反,您应该使用IAnimal
方法使用Sound()
,并分别使用接口ICatchesMouse
和ICatchesDisk
。这样,Animal
无需实现不必要的方法。
答案 1 :(得分:2)
您可以使用Interface Segregation Principle。
接口隔离原则(ISP)规定,不应强迫任何客户端依赖其不使用的方法。
您的IAnimal
接口将仅具有Sound()
,然后您创建一个名为ICat
的新接口,该接口继承自IAnimal
,此接口将具有CatchMouse()
。您的课程Cats
将从ICat
继承。
Here's一个实际示例。