Совместимы ли интерфейсы с полиморфизмом

У меня проблемы с концепцией интерфейсов, взаимодействующих с полиморфными типами (или даже полиморфными интерфейсами). Я разрабатываю на C # и буду признателен, чтобы ответы оставались близкими к этому определению, хотя я думаю, что это по-прежнему дает всем достаточно места, чтобы дать ответ.

В качестве примера, допустим, вы хочу сделать программу для раскрашивания вещей. Вы определяете интерфейс для актера, который рисует, и вы определяете интерфейс для объекта, который рисует. Кроме того, у вас есть некоторые объекты, которые можно рисовать более конкретным способом.

interface IPainter {
  void paint(IPaintable paintable);
}
interface IPaintable {
  void ApplyBaseLayer(Color c);
}
interface IDecalPaintable : IPaintable {
  void ApplyDecal(HatchBrush b);
}

Я могу представить себе создание художника, подобного следующему :

class AwesomeDecalPainter : IPainter
  {
    public void paint(IPaintable paintable) {
      IDecalPaintable decalPaintable = (IDecalPaintable)paintable;
      decalPaintable.ApplyBaseLayer(Color.Red);
      decalPaintable.ApplyDecal(new HatchBrush(HatchStyle.Plaid, Color.Green));
    }
  }

Конечно, это вызовет ошибку, если paintable не реализует IDecalPaintable. Он сразу же вводит связь между реализацией IPainter и IPaintable, с которой работает. Однако я также не думаю, что имеет смысл говорить, что AwesomeDecalPainter не является IPainter только потому, что его использование ограничено подмножеством домена IPaintable.

Так что мой вопрос действительно четырехкратный:

  • Совместимы ли интерфейсы с Кроме того, у вас есть некоторые предметы, которые можно раскрасить более специфическим образом.

    interface IPainter {
      void paint(IPaintable paintable);
    }
    interface IPaintable {
      void ApplyBaseLayer(Color c);
    }
    interface IDecalPaintable : IPaintable {
      void ApplyDecal(HatchBrush b);
    }
    

    Я могу представить создание художника, подобного следующему:

    class AwesomeDecalPainter : IPainter
      {
        public void paint(IPaintable paintable) {
          IDecalPaintable decalPaintable = (IDecalPaintable)paintable;
          decalPaintable.ApplyBaseLayer(Color.Red);
          decalPaintable.ApplyDecal(new HatchBrush(HatchStyle.Plaid, Color.Green));
        }
      }
    

    Конечно, это вызовет ошибку, если paintable не реализует IDecalPaintable. Он сразу же вводит связь между реализацией IPainter и IPaintable, с которой работает. Однако я также не думаю, что имеет смысл говорить, что AwesomeDecalPainter не является IPainter только потому, что его использование ограничено подмножеством домена IPaintable.

    Так что мой вопрос действительно четырехкратный:

    • Совместимы ли интерфейсы с Кроме того, у вас есть некоторые предметы, которые можно раскрасить более специфическим образом.

      interface IPainter {
        void paint(IPaintable paintable);
      }
      interface IPaintable {
        void ApplyBaseLayer(Color c);
      }
      interface IDecalPaintable : IPaintable {
        void ApplyDecal(HatchBrush b);
      }
      

      Я могу представить создание художника, подобного следующему:

      class AwesomeDecalPainter : IPainter
        {
          public void paint(IPaintable paintable) {
            IDecalPaintable decalPaintable = (IDecalPaintable)paintable;
            decalPaintable.ApplyBaseLayer(Color.Red);
            decalPaintable.ApplyDecal(new HatchBrush(HatchStyle.Plaid, Color.Green));
          }
        }
      

      Конечно, это вызовет ошибку, если paintable не реализует IDecalPaintable. Он сразу же вводит связь между реализацией IPainter и IPaintable, с которой работает. Однако я также не думаю, что имеет смысл говорить, что AwesomeDecalPainter не является IPainter только потому, что его использование ограничено подмножеством домена IPaintable.

      Так что мой вопрос действительно четырехкратный:

      • Совместимы ли интерфейсы с Он сразу же вводит связь между реализацией IPainter и IPaintable, с которой работает. Однако я также не думаю, что имеет смысл говорить, что AwesomeDecalPainter не является IPainter только потому, что его использование ограничено подмножеством домена IPaintable.

        Так что мой вопрос действительно четырехкратный:

        • Совместимы ли интерфейсы с Он сразу же вводит связь между реализацией IPainter и IPaintable, с которой работает. Однако я также не думаю, что имеет смысл говорить, что AwesomeDecalPainter не является IPainter только потому, что его использование ограничено подмножеством домена IPaintable.

          Так что мой вопрос действительно четырехкратный:

          • Совместимы ли интерфейсы с полиморфизм вообще?
          • Это хорошо? дизайн для реализации IPainter, который может работать с IDecalPaintable?
          • А если он может работать исключительно на IDecalPaintable?
          • Есть ли литература или исходный код, иллюстрирует, как интерфейсы и полиморфные типы должны взаимодействовать?
22
задан hannasm 27 May 2011 в 06:35
поделиться