我被要求在面向对象编程术语中描述车辆、汽车、丰田之间的关系(假设在 php 环境中)。我被难住了。有人可以帮我吗?谢谢...
15 回答
我认为丰田是指公司。
我会说:
Vehicle 是一个对象,而 Car 是 Vehicle 的一种。Toyota 是 Vehicle 对象的特定实现者,其brake
方法重载以返回 false。
汽车是汽车,丰田汽车是汽车。
最直接的说法是 thatcar
可能是 的子类,vehicle
而 atoyota car
可能是 的子类car
。
当然,Toyota
也可以指公司,在这种情况下,情况会有所不同。不过,我很确定上面的段落是他们期望听到的。
Car是Vehicle 的一种类型——因此您可以将其Vehicle
视为Car
.
丰田生产汽车。我不会将其作为继承关系,而是倾向于将manufacturer
成员变量添加到Vehicle
. 然后对于Car
丰田制造的实例,设置car.manufacturer = "Toyota"
.
只是尴尬:汽车是车辆的子类,卡车也是。丰田是一家制造汽车和卡车的制造商。所以丰田应该是车辆制造商属性的几个潜在值之一。
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');
你的意思是:
class Vehicle{
}
class Car extends Vehicle{
}
class Toyota extends Car{
}
“Vehicle”是一个基类,“Car”是一个扩展、继承或派生自“Vehicle”的类(取决于所使用的语言),理想情况下,“Toyota”应该是“品牌”的价值或“制作”这两个类之一的属性。
车辆是一个基类。汽车是派生类。Toyota(可能)是一个可以分配给 Vehicle 类的“品牌”成员的值。从理论上讲,您可以从车辆(或该订单上的其他东西)中获得丰田,但 IMO 这通常是一个糟糕的主意。派生通常应该反映功能,并且很少有与品牌相关的功能方式。
考虑它的最基本方法是在您正在使用的逻辑层次结构中。这实际上适用于世界上的任何事物。每个人在这里所说的都是正确的,但如果您不了解 OOP,它可能无法帮助您理解他们在说什么。所以请允许我详细说明。
车辆:车辆可以是任何类型的交通工具。请记住,它可能是飞机、火车、汽车、自行车、热气球等。车辆是用来将您从一个地方带到另一个地方的东西。因此,作为车辆的基类告诉您它将成为一种运输设备。
汽车:汽车是交通工具的一种形式。因此,它扩展了车辆。汽车可以描述为具有 4 个轮子、2-n 门(取决于汽车)、发动机、方向盘、雨刷、大灯、转向灯、制动器、加速器等的车辆。所以 car 进一步描述了您是什么车辆指。
丰田:丰田是汽车的一种形式。因此,它扩展了汽车。(如果您正在使用卡车类,它也可以扩展卡车)。丰田的某些元素可能不适用于每辆车。因此,为了帮助进一步定义汽车的类型,丰田可以指定油耗、车门数量、颜色、发动机尺寸等。
希望有帮助。
丰田是汽车。汽车是交通工具。因此,Toyota 类将从 Car 继承,而 Car 又会从 Vehicle 继承。
车辆是一类。Car 是 Vehicle 的子类。Toyota 可以是 Car 类的(相当通用的)实例,或者是添加 Toyota 特定功能的子类。
汽车是汽车,丰田是汽车。
因此,Toyota 可以是 Car 的子类,Car 可以是 Vehicle 的子类。
class Vehicle {
}
class Car extends Vehicle {
}
class Toyota extends Car {
}
例如,一辆车可能有一个成员 var 来指示轮子的数量和一个打开引擎的函数(并非所有车辆都有引擎)。虽然 Toyota 可能具有与 Car 相同的 vars,但还包含一个包含模型名称的字符串以及请求踏板保修的方法;-)
你可以采取不同的方法。
Car
是 的子类Vehicle
。Toyota
是 的子类Car
。Car
是 的子类Vehicle
。Car
有一个名为 的属性make
。您实例化 Car 并将其设置make
为“Toyota”。
有更多的方法可以做到这一点,但是这两种是最明显的,适合 OOP 概念。
关键是问问自己那里最通用的术语是什么?是车辆。您可以拥有多种车辆,例如卡车、SUV、自行车、气垫船和汽车。因此,在 OOP 中,您更具体的类继承自更通用的类。
在面向对象术语中,Vehicle 将是基类 car 将是 Vehicle 的子类
而丰田将品牌名称作为属性。
我的看法:“丰田”不应该源自“汽车”,因为丰田是一家公司,而不是特定的汽车。“toyota_car”可以派生自“car”。“toyota”应该是从“manufacturer”类派生的,而“manufacturer”类又是从“company”类派生的。“车辆”类应该有一个指向类“制造商”的指针类型的类成员。对于丰田制造的汽车,类“car”的实例化对象应该具有指向类“toyota”的单例对象的继承类成员。(C++)
当然,这不是面试官想听到的答案,但面向对象编程的目标不是对整个世界进行建模,而只是提供抽象数据类型,对应用程序领域中的特定概念进行建模。
因此,这三者之间的关系完全取决于您正在制作的应用程序。车辆和汽车完全有可能属于同一类。许多应用程序可能并不关心它是什么类型的车辆。他们也可能不在乎它是什么品牌,让您也可以扔掉丰田类。
OOP 本来可以是一个有用的工具,如果它没有被认为编程目标是生成整个宇宙的 UML 图的白痴作为人质。