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

时间:2017-10-27 13:58:59

标签: oop design-patterns ooad gang-of-four

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

   Gamma,Erich。设计模式:可重用面向对象的元素   软件(Addison-Wesley专业计算系列)(Kindle   地点593-596)。皮尔逊教育。 Kindle版。

     

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

2 个答案:

答案 0 :(得分:2)

过于简单化......

  1. 界面 - 一个班级拥有的东西及其可以做的事情的列表......一系列回答" Whats"

  2. 实施 - 回答关于"如何"的问题。 " Whats"完成了。

  3. 实施例:    一个接口IPackageMover,它可以完成两个实际实现接口的东西和两个类(类型)(除了接口之外还需要做其他事情)

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

答案 1 :(得分:1)

  

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

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

  1. A Car IS-A Vehicle。根据这个定义,Car能够将人/货物从一个地方运送到另一个地方。
  2. Car也是Car。根据这个定义,它可以使用方向盘驱动
  3. 在上面的示例中,Car IS-A CarCar也是Vehicle ,因为可以使用方向盘将货物/人员从一个地方移动到另一个地方。换句话说,现实世界中对象的类型是由你可以用它做的事情定义的(相对于它的界面。)

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