Почему тип объекта ссылается на его интерфейс? (Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения)
Почему тип объекта ссылается на его интерфейс? Почему термин тип используется здесь? С точки зрения C++ я не могу этого понять.
Гамма, Эрих. Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения (серия Addison-Wesley Professional Computing) (Kindle Locations 593-596). Пирсон Образование. Kindle Edition.
Класс объекта определяет, как объект реализован. Класс определяет внутреннее состояние объекта и реализацию его операций. Напротив, тип объекта относится только к его интерфейсу - на набор запросов, на которые он может ответить. Объект может иметь много типов, а объекты разных классов могут иметь один и тот же тип.
2 ответа
Почему тип объекта ссылается на его интерфейс? Почему термин тип используется здесь? С точки зрения C++ я не могу этого понять.
Объекты в ООП мало чем отличаются от реального мира. Например:
Car
ЭТОVehicle
, По этому определениюCar
имеет возможность перевозить людей / грузы из одного места в другое.Car
такжеCar
, По этому определению он может двигаться с помощью рулевого колеса.
В приведенном выше примере Car
ЭТО Car
и Car
также Vehicle
потому что его можно управлять с помощью рулевого колеса для перемещения грузов / людей из одного места в другое. Другими словами, тип объекта в реальном мире определяется тем, что вы можете с ним сделать (по отношению к его интерфейсу).
Если мы используем вышеуказанную аналогию в программировании, Car
это подкласс Vehicle
и код, который имеет Car
объект может использовать все функции из Vehicle
так же как Car
, Это будет означать, что Car
ЭТО Vehicle
и Car
, В заключение, тип объекта определяется его интерфейсом, то есть набором операций, которые он поддерживает.
Упрощение...
Интерфейс - это список того, что есть у класса, и того, что он может делать... список того, что отвечает на вопросы "Что"
Реализация - отвечает на вопрос "Как" то, что "сделано".
Пример: интерфейс 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
}
}