c# - 依赖注入导致不必要的实现
问题描述
我正在创建一个实现IAnimal接口的Animal类。然后,Cats和Dogs类都实现了 IAnimal接口。目前我在IAnimal中只保留了 3 个简单的方法来进行简短的演示。主类Animals是使用依赖注入 (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(Interface Segregation,https://en.wikipedia.org/wiki/Interface_segregation_principle),IAnimal
不应该有 CatchDisk
or CatchMouse
方法。相反,您应该拥有 IAnimal
该 Sound()
方法,以及单独的接口 ICatchesMouse
和 ICatchesDisk
. 这样就 Animal
不必实现不必要的方法。
推荐阅读
- xamarin - KFGQPC Uthmanic Script HAFS 无法正确塑造 Xamarin 表单中的阿拉伯数字
- r - 在两个字符串中查找匹配对
- php - 如果 MySQL 上的语句以不同的顺序产生结果
- scala - prepend 如何保持 List 的不变性,而 append 却没有?
- javascript - 使用 JavaScript 的 Document.write() 创建 HTML 链接
- arrays - 扩展一个可选的 Equatables 数组?
- python - 在正则表达式中不使用 OR 运算符的负向回溯 - Python
- linux - 如何确定是否使用 bash 脚本以 root/sudo 身份运行脚本/命令
- python - Python在不使用方法的情况下选择字符串中的第一个单词
- diagram - drawio中的嵌套可折叠容器?