【问题标题】:The object oriented relationship面向对象的关系
【发布时间】:2011-03-31 00:35:07
【问题描述】:

我被要求在面向对象编程术语中描述车辆、汽车、丰田之间的关系(假设在 php 环境中)。我被难住了。有人可以帮我吗?谢谢...

【问题讨论】:

  • 如果这是作业或面试问题,请注明。
  • 如果是 Java,你可能需要 Vehicule.ToyotaFactory 什么的。
  • so.. 2 分钟内有 9 个答案是怎么回事?谢谢你们。顺便说一句,这是一个面试问题......我相信我当时回答得很好,但不确定你们是否能提出更好的答案。向所有人 +1
  • 这里没有那些糊涂的信息。你的系统的意图是什么?你在汽车、丰田、Vehicle 后面放了什么?
  • Google 会讨厌我们这么多地命名丰田并搞砸丰田的搜索:P

标签: php oop class car-analogy


【解决方案1】:

我认为丰田指的是公司。

我会说:

Vehicle 是一个对象,而 Car 是 Vehicle 的一种。 Toyota 是 Vehicle 对象的特定实现者,其 brake 方法重载以返回 false。

【讨论】:

  • 我不能让自己点击向上箭头,但是大声笑!
  • 哈哈哈哈哈哈!罗弗莱。天啊。无耻让我泪流满面! +20 邪恶小丑!
  • 什么意思?丰田是工厂(在工厂模式的意义上)? “Vehicle 的特定实现者”在 OOP 中没有任何意义
  • @Artefacto,是的,Toyota 是一个生产 Vehicle 对象的工厂对象,可以是 Car 对象、Truck 对象或其他对象。
  • Car、Truck等派生类继承了默认总是返回false的brake属性。
【解决方案2】:

汽车是汽车,丰田汽车是汽车。

最直接的说法是car 可以是vehicle 的子类,toyota car 可以是car 的子类。

当然,Toyota 也可以指公司,在这种情况下情况会有所不同。不过,我很确定上面的段落是他们希望听到的。

【讨论】:

  • 而buy_toyota是Toyota_car类的一个方法..)
  • 肯定buy()是汽车的一种方法吗?甚至车辆? :)
  • @Alex 他我更喜欢 Stand 类,它有一个接收汽车对象的方法 buy:p
  • 当然,ToyotaCar 会有一个错误的accelerate 方法:p
  • @Alexander:所以我需要有一辆丰田的车才能从丰田买车?这是一个非常糟糕的商业模式
【解决方案3】:

汽车是一种车辆类型 - 所以您可以将Vehicle 视为Car 的基类。

丰田生产汽车。我倾向于将manufacturer 成员变量添加到Vehicle,而不是使其成为继承关系。然后对于丰田制造的Car 实例,设置car.manufacturer = "Toyota"

【讨论】:

    【解决方案4】:

    尴尬:汽车是车辆的子类,卡车也是。 丰田是一家制造汽车和卡车的制造商。所以丰田应该是车辆制造商属性的几个潜在值之一。

    class Vehicle{ 
    
       protected $_model;
    
       protected $_manufacturer;
    
       public __construct($manufacturer) {
           $this->_manufacturer = $manufacturer;
       }
    } 
    
    class Car extends Vehicle{ 
       public __construct($model,$manufacturer) {
           parent::__construct($manufacturer);
       }
       $this->_model = $model;
    } 
    
    class Truck extends Vehicle{ 
       public __construct($model,$manufacturer) {
           parent::__construct($manufacturer);
       }
       $this->_model = $model;
    } 
    
    $a = new Car('Avensis','Toyota');
    $b = new Truck('Land Cruiser','Toyota');
    

    【讨论】:

      【解决方案5】:

      你的意思是:

      class Vehicle{
      }
      
      class Car extends Vehicle{
      }
      
      class Toyota extends Car{
      }
      

      【讨论】:

      • 我不同意。丰田是汽车的一个例子,它没有新的行为。
      • @Matt Ellen 我不同意这一点。您可以轻松想象特定品牌汽车(OnStar 等)独有的功能
      • @dave stackoverflow.com/questions/3503392/…检查最后一行
      • 丰田也生产卡车。这是否意味着车辆>卡车>丰田?我不同意这个。
      • 公平点,@dave。我不喜欢汽车,所以我只是想它们都是一样的;)
      【解决方案6】:

      “Vehicle”是一个基类,“Car”是一个扩展、继承或派生自“Vehicle”的类(取决于使用的语言),理想情况下,“Toyota”应该是这两个类别之一的“品牌”或“品牌”属性。

      【讨论】:

        【解决方案7】:

        Vehicle 是一个基类。汽车是派生类。 Toyota(可能)是一个可以分配给 Vehicle 类的“品牌”成员的值。从理论上讲,您可以从车辆(或该订单上的其他东西)中衍生出丰田,但 IMO通常是一个糟糕的主意。派生通常应该反映功能,而与品牌相关的功能方式很少。

        【讨论】:

          【解决方案8】:

          考虑它的最基本方法是在您正在使用的逻辑层次结构中。这实际上适用于世界上的任何事物。每个人在这里所说的都是正确的,但如果您不了解 OOP,它可能无法帮助您理解他们在说什么。所以请允许我详细说明。

          车辆:车辆可以是任何类型的交通工具。请记住,它可能是飞机、火车、汽车、自行车、热气球等。车辆是用来将您从一个地方带到另一个地方的东西。所以作为vehicle的基类告诉你它将是一个运输设备。

          汽车:汽车是一种交通工具。因此,它扩展了车辆。汽车可以描述为具有 4 个轮子、2-n 门(取决于汽车)、发动机、方向盘、雨刷、大灯、转向灯、制动器、加速器等的车辆。所以 car 进一步描述了您是什么车辆参考。

          丰田:丰田是汽车的一种形式。因此,它扩展了汽车。 (如果您正在使用卡车类,它也可以扩展卡车)。丰田的某些元素可能不适用于每辆车。因此,为了帮助进一步定义汽车的类型,丰田可以指定油耗、车门数量、颜色、发动机尺寸等。

          希望对您有所帮助。

          【讨论】:

          • ... 蓝色汽车是汽车的一种形式。因此它扩展了汽车。车窗有划痕的蓝色汽车是蓝色汽车的一种形式,因此它扩展了蓝色汽车。这些都没有给你一个有用的对象层次结构。推导还有其他一些要求,而不仅仅是“是一种形式”。它还必须具有某种独特的属性实际上与域相关,例如
          【解决方案9】:

          丰田是一辆汽车。汽车是交通工具。 因此,Toyota 类将从 Car 继承,而 Car 又会从 Vehicle 继承。

          【讨论】:

            【解决方案10】:

            Vehicle 是一个类。 Car 是 Vehicle 的子类。 Toyota 可以是 Car 类的(相当通用的)实例,也可以是添加 Toyota 特定功能的子类。

            【讨论】:

              【解决方案11】:

              汽车是车辆,丰田是汽车。

              因此,Toyota 可以是 Car 的子类,Car 可以是 Vehicle 的子类。

              class Vehicle {
              
              }
              
              class Car extends Vehicle {
              
              }
              
              class Toyota extends Car {
              
              }
              

              例如,汽车可能有一个成员 var 来指示轮子的数量和一个启动引擎的函数(并非所有车辆都有引擎)。虽然 Toyota 可能具有与 Car 相同的 vars,但还包含一个包含模型名称的字符串和请求踏板保修的方法;-)

              【讨论】:

                【解决方案12】:

                您可以采取不同的方法。

                1. CarVehicle 的子类。 ToyotaCar 的子类。

                2. CarVehicle 的子类。 Car 有一个名为 make 的属性。您实例化 Car 并将其 make 设置为“Toyota”。

                有更多的方法可以做到这一点,但是这两种是最明显的符合 OOP 概念的方法。

                关键是问问自己那里最通用的术语是什么?是车辆。您可以拥有多种车辆,例如卡车、SUV、自行车、气垫船和汽车。因此,在 OOP 中,您更具体的类继承自更通用的类。

                【讨论】:

                  【解决方案13】:

                  在面向对象的术语中 车辆将是基类 car 将是车辆的子类

                  而丰田将品牌名称作为属性。

                  【讨论】:

                    【解决方案14】:

                    当然,这不是你的面试官想听到的答案,但是面向对象编程的目标不是对整个世界进行建模,而只是提供抽象数据类型,这些数据类型对中的特定概念进行建模您的应用程序的域

                    因此,三者之间的关系完全取决于您正在制作的应用程序。车辆和汽车完全有可能是同一类。许多应用程序可能并不关心它是什么类型的车辆。他们也可能不在乎它是什么品牌,让您也可以扔掉丰田类。

                    OOP 本来可以是一个有用的工具,如果它没有被那些认为编程目标是生成整个宇宙的 UML 图的白痴劫持的话。

                    【讨论】:

                      【解决方案15】:

                      我的看法: “toyota”不应该源自“car”,因为丰田是一家公司,而不是特定的汽车。 “toyota_car”可以派生自“car”。 “toyota”应该是从“manufacturer”类派生的,而“manufacturer”类又是从“company”类派生的。 “车辆”类应该有一个指向类“制造商”的指针类型的类成员。对于丰田制造的汽车,类“car”的实例化对象应该具有指向类“toyota”的单例对象的继承类成员。 (C++)

                      【讨论】:

                        猜你喜欢
                        • 2014-09-28
                        • 1970-01-01
                        • 2011-04-21
                        • 1970-01-01
                        • 2014-08-05
                        • 2011-03-23
                        • 2010-10-19
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多