Интерфейс, который реализует все это реализации - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть интерфейс:

public interface IPettable
{
   void Pet();
}

У меня есть два класса, которые реализуют этот интерфейс:

public class Cat : IPettable
{
   public void Pet()
   {
      ...
   }
}

public class Dog : IPettable
{
   public void Pet()
   {
      ...
   }
}

Я хочу, чтобы третий интерфейс IPettable мог два вызова обеих этих реализаций. Как это сделать?

public class PetAllAnimals : IPettable
{
   public void Pet()
   {
       dog.Pet();
       cat.Pet();
   }
}

1 Ответ

1 голос
/ 08 апреля 2020

Вы можете получить все классы, которые реализуют интерфейс IPettable и вызывают метод Pet(). как это

public class PetAllAnimals : IPettable
{
   public void Pet()
   {
        var ipettableType = typeof(IPettable);
        var types = Assembly.GetExecutingAssembly().GetExportedTypes()
            .Where(a => !a.IsInterface &&
            ipettableType.IsAssignableFrom(a) &&
            a.GetTypeInfo() != typeof(PetAllAnimals).GetTypeInfo());

        foreach (var item in types)
        {
            IPettable instance = (IPettable)Activator.CreateInstance(item);
            instance.Pet();
        }
   }
}

Другой способ - создать экземпляр класса Cat и Dog, затем инициализировать поля в constructor и вызвать Pet() метод

public class PetAllAnimals : IPettable
{
   private readonly IPettable dog;
   private readonly IPettable cat;
   public PetAllAnimals()
   {
       cat = new Cat();
       dog = new Dog();
   }
   public void Pet()
   {
       dog.Pet();
       cat.Pet();
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...