当前位置: 首页 > 知识库问答 >
问题:

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

韩宏朗
2023-03-14

我正在创建一个实现IAnimal接口的Animal类。然后,Cats和Dogs类都实现了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();
    }
}

共有2个答案

亢建木
2023-03-14

可以使用接口隔离原则。

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

你的IAnimal界面将只有Sound(),然后你创建了一个名为ICat的新界面,它继承了IAnimal,这个界面将有CatchMouse()。您的类Cats将继承自ICat

下面是一个实际的例子。

岳浩
2023-03-14

如果遵循SOLID原则,尤其是I(接口隔离,https://en.wikipedia.org/wiki/Interface_segregation_principle),那么IEM就不应该有CatchDiskCatchMouse方法。相反,您应该有声音()方法的IEM,以及单独的接口ICatchesMouseICatchesDisk。这样,动物就不必实现不必要的方法。

 类似资料:
  • 在React中,想做依赖注入(Dependency Injection)其实相当简单。请看下面这个例子: // Title.jsx export default function Title(props) { return <h1>{ props.title }</h1>; } // Header.jsx import Title from './Title.jsx'; export defa

  • 依赖注入 Dependency Injection is a strong mechanism, which helps us easily manage dependencies of our classes. It is very popular pattern in strongly typed languages like C# and Java. 依赖注入是一个很强大的机制,该机制可以帮

  • 简介 Hyperf 默认采用 hyperf/di 作为框架的依赖注入管理容器,尽管从设计上我们允许您更换其它的依赖注入管理容器,但我们强烈不建议您更换该组件。 hyperf/di 是一个强大的用于管理类的依赖关系并完成自动注入的组件,与传统依赖注入容器的区别在于更符合长生命周期的应用使用、提供了 注解及注解注入 的支持、提供了无比强大的 AOP 面向切面编程 能力,这些能力及易用性作为 Hyper

  • 出自维基百科 Wikipedia: 依赖注入是一种允许我们从硬编码的依赖中解耦出来,从而在运行时或者编译时能够修改的软件设计模式。 这句解释让依赖注入的概念听起来比它实际要复杂很多。依赖注入通过构造注入,函数调用或者属性的设置来提供组件的依赖关系。就是这么简单。

  • 我已经提出了这个简化的测试用例,它是我在处理一个非常大的项目时遇到的问题。重要的一点是只有在特定的概要文件中激活一些代码及其依赖关系。下面是POM文件来演示它: 在与POM相关的src/fox/java/project1目录中,我使用POM的jar依赖关系得到了这个简单的类: 我可以使用此命令构建上述项目而没有问题: 但我不知道如何正确地将这个Maven项目导入Eclipse。如果我在Eclips

  • 问题内容: 当我尝试将$ http注入到覆盖的工厂中时,出现错误: 未捕获的错误:[$ injector:cdep]找到循环依赖项:$ http <-$ exceptionHandler <-$ rootScope 任何想法如何解决?如果我使用[]注入,则$ http是未定义的 编辑 ___ _ ___ ___ _ 根据下面的答案,我尝试了: 但我仍然收到循环错误: 未捕获的错误:[$ injec