Почему тип объекта ссылается на его интерфейс? (Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения)

Почему тип объекта ссылается на его интерфейс? Почему термин тип используется здесь? С точки зрения C++ я не могу этого понять.

Гамма, Эрих. Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения (серия Addison-Wesley Professional Computing) (Kindle Locations 593-596). Пирсон Образование. Kindle Edition.

Класс объекта определяет, как объект реализован. Класс определяет внутреннее состояние объекта и реализацию его операций. Напротив, тип объекта относится только к его интерфейсу - на набор запросов, на которые он может ответить. Объект может иметь много типов, а объекты разных классов могут иметь один и тот же тип.

2 ответа

Решение

Почему тип объекта ссылается на его интерфейс? Почему термин тип используется здесь? С точки зрения C++ я не могу этого понять.

Объекты в ООП мало чем отличаются от реального мира. Например:

  1. Car ЭТО Vehicle, По этому определению Car имеет возможность перевозить людей / грузы из одного места в другое.
  2. Car также Car, По этому определению он может двигаться с помощью рулевого колеса.

В приведенном выше примере Car ЭТО Car и Car также Vehicle потому что его можно управлять с помощью рулевого колеса для перемещения грузов / людей из одного места в другое. Другими словами, тип объекта в реальном мире определяется тем, что вы можете с ним сделать (по отношению к его интерфейсу).

Если мы используем вышеуказанную аналогию в программировании, Car это подкласс Vehicle и код, который имеет Car объект может использовать все функции из Vehicle так же как Car, Это будет означать, что Car ЭТО Vehicle и Car, В заключение, тип объекта определяется его интерфейсом, то есть набором операций, которые он поддерживает.

Упрощение...

  1. Интерфейс - это список того, что есть у класса, и того, что он может делать... список того, что отвечает на вопросы "Что"

  2. Реализация - отвечает на вопрос "Как" то, что "сделано".

Пример: интерфейс IPackageMover, который выполняет 2 действия и 2 класса (типы), который фактически реализует интерфейс (а также выполняет другие действия, помимо требований интерфейса)

 // the interface
 public interface IPackageMover
 {
    string GetName();
    void public void MoveTo(Package package, string newAddress); 
 }

 // the "type" that has the implementation
 public class JoeThePackageMover : IPackageMover
 {
    public string GetName()
    {
        return "Joe";
    }
    public void MoveTo(Package package, string newAddress)
    {
        PickUp(package);
        Drive(newAddress);
        DropOff(package);
    }
    public void PickUp(Package package)
    {
        // do stuff
    }
    public void Drive(string newAddress)
    {
        // do stuff
    }
    public void DropOff(Package package)
    {
        // do stuff
    }
 }

 // another "type" with the same interface
 public class PassTheBuckPackageMover : IPackageMover
 {
    public string GetName()
    {
        return "What do you want it to be?";
    }
    public void MoveTo(Package package, string newAddress)
    {
        var joe = new JoeThePackageMover();
        joe.MoveTo(package, newAddress);            
    }
    public void Chill()
    {
        //do stuff
    }

 }  
Другие вопросы по тегам