我一直在使用依赖项注入,并且注意到在构造函数(您要注入的)中,参数通常是接口或基类。我想我理解参数是接口还是基类的原因。但是,我意识到有时尝试插入的实际类/对象可能会使用接口或基类都不应该具有的方法(因为只有我要实例化的实际类/对象才应具有该方法) 。但是如果是这种情况,这意味着如果注入的参数是接口或基类,则无法调用该方法。我是否应该只创建另一个接口,该接口包含要在要实例化的实际类/对象上使用的方法?我在下面有一个例子:
public interface IAnimal
{
void Eat();
}
public abstract class Mammals : IAnimal
{
public void Eat()
{
//eating code
}
public void Sleep()
{
//sleep code
}
}
public class Whale : Mammals
{
public void Swim()
{
//swim code
}
}
public class Dog : Mammals
{
public void Run()
{
//run code
}
}
//Injecting here
public class Class1
{
private readonly Mammals x;
public Class1(Mammals x)
{
this.x = x;
}
public class Method1()
{
x.Eat();
x.Sleep();
//I can't call swim() unless I do below:
//Whale y = x;
//y.Swim();
}
}
我一直认为使用接口或基类(在注入注入中)可以使代码更简洁,因为如果我决定更改要注入的类/对象,则无需进行任何更改。代码,因为无论我注入什么对象都将具有接口或具有基类。但是,如果我添加了允许我使用Swim()的代码,后来又决定注入Dog类,则必须将代码更改为使用Run()。我试图充分理解依赖注入以及利用它的正确方法。我注意到我的代码绝对看起来更干净。我应该如何处理上述代码?
答案 0 :(得分:1)
如果此类确实涉及任何种类的哺乳动物,并且您想让其中的一些动物游泳,那么您可以测试注入的对象是否实现了ISwim。
例如(哺乳动物为ISwim)?. Swim();
答案 1 :(得分:1)
这不完全是依赖注入问题,而是设计问题。 依赖注入用于解耦,并允许进行更好的单元测试,从而帮助使客户端与设计变更或实施的影响隔离。 对于您的问题,您可以调用Move(),该方法应该与所有哺乳动物都有关,或者按照上面的建议使用iwater哺乳动物。