Я использовал внедрение зависимостей, и я заметил, что в конструкторах (которые вы внедряете) параметры обычно являются интерфейсом или базовым классом. Мне кажется, я понимаю причину, по которой параметры являются интерфейсом или базовым классом. Тем не менее, я понимаю, что бывают случаи, когда фактический класс / объект, который я пытаюсь внедрить, может использовать метод, который не должен иметь ни интерфейс, ни базовый класс (поскольку только фактический класс / объект, который я создаю, должен иметь этот метод) , Но если это так, это означает, что я не могу вызвать этот метод, если введенные параметры являются интерфейсом или базовым классом. Должен ли я просто создать другой интерфейс, который будет содержать метод, который я хочу, для фактического класса / объекта, который я пытаюсь создать? У меня есть пример ниже:
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 (). Я пытаюсь полностью понять внедрение зависимости и правильный способ ее использования. Я заметил, что мои коды определенно выглядят чище из-за этого. Как я должен go о выпуске вышеуказанного кода?