为什么对象的类型引用其接口?(设计模式:可重用面向对象软件的元素一书)



为什么对象的类型引用它的接口?为什么在这里使用术语类型?就C++而言,我无法理解它。

伽玛,埃里希。设计模式:可重用的面向对象的元素 软件(Addison-Wesley Professional Computing Series) (Kindle 地点 593-596)。培生教育。点燃版。

对象的类定义对象的实现方式。该类 定义对象的内部状态及其实现 操作。相反,对象的类型仅指其 接口 - 它可以响应的请求集。一个对象可以 有许多类型,不同类的对象可以具有相同的 类型。

过于简单化...

  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
}
}  

为什么对象的类型引用它的接口?为什么在这里使用术语类型?就C++而言,我无法理解它。

OOP 中的对象与现实世界没有太大区别。例如:

  1. CarIS-AVehicle.根据这个定义,Car有能力将人员/货物从一个地方运送到另一个地方。
  2. Car也是Car.根据这个定义,它能够使用方向盘驱动

在上面的例子中,CarIS-ACarCar也是Vehicle因为它可以使用方向盘驱动,将货物/人员从一个地方移动到另一个地方。换句话说,现实世界中对象的类型是由你可以用它做的事情(相对于它的界面)定义的。

如果我们在编程中使用上述类比,CarVehicle的子类,具有Car对象的代码可以使用Vehicle中的所有函数以及Car。这意味着CarIS-AVehicleCar.总之,对象的类型由其接口定义,即它支持的操作集。

最新更新