亚马逊面试问题: 设计一个面向对象的停车场

设计一个 OO 停车场。它将具有哪些类和函数。应该说,满的,空的,也能找到泊车位的代客泊车。停车场有3种不同的停车类型: 普通型、残疾型和紧凑型。

谢谢!

208117 次浏览

这里是一个快速启动齿轮转动..。

停车场是一个类。

停车位是一个类。

停车场有个入口。

入口有一个位置,或更具体地说,从入口的距离。

ParkingLotSign 是一个类。

停车场有停车场标志。

ParkingLot has a finite number of ParkingSpaces.

残疾人停车空间是停车空间的一个子类。

正则停车空间是停车空间的一个子类。

CompactParkingSpace 是 ParkingSpace 的一个子类。

停车场保持一系列的停车位,和一个单独的空置的停车位的排列,从它的入口的距离。

可以通过调用. Full ()、 . Empty ()或. Normal ()来告诉 ParkingLotSign 显示“已满”或“空”,或“空白/正常/部分占用”

帕克是一个阶级。

Parker can Park().

帕克可以解除停车。

代客泊车是 Parker 的一个子类,它可以调用 ParkingLot.FindVacantSpaceNearestEntry () ,返回一个 ParkingSpace。

Parker 有个停车位。

帕克可以打电话给停车场。

帕克呼叫入口。进入()和进入。Exiting ()和 ParkingSpace 在停车场被占用或空置时通知停车场,以便停车场可以确定是否已满。如果它是新满的或新空的或新不满的或空的,它应该更改 ParkingLotSign。全()或停车场标志。空()或停车场标志。正常()。

残疾的 Parker 可以是 Parker 和 CompactParker 的一个子类,Parker 的一个子类,正常的 Parker 的一个子类。(实际上可能有点过头了)

在这个解决方案中,帕克有可能被重命名为汽车。

在一个面向对象的停车场,将不需要服务员,因为汽车将“知道如何停车”。

在停车场找到一辆可用的汽车将是困难的; 最常见的模型要么将其所有的运动部件暴露为公共成员变量,要么将它们“完全封装”的汽车没有窗户或门。

在我们的 OO 停车场的停车位将不匹配的大小和形状的汽车(一个“阻抗不匹配”之间的空间和汽车)

我们的车牌上每个字母和数字之间都有一个点。残疾人停车场将只有以“ _”开头的许可证,以“ m _”开头的许可证将被拖走。

您将需要一个停车场,其中包含一个类型为“ space”的多维数组(在构造函数中指定)。停车场可以通过调用填充和空出空间的函数来跟踪有多少空间被占用。空间可以包含一个枚举类型,该类型说明它是什么类型的空间。Space 还有一个方法 take ()。找到第一个可以停车的地方,把车停在那里。您还需要一个汽车对象放在空间,以持有它是一个残疾人,紧凑型,或普通车辆。


class ParkingLot
{
Space[][] spaces;


ParkingLot(wide, long); // constructor


FindOpenSpace(TypeOfCar); // find first open space where type matches
}


enum TypeOfSpace = {compact, handicapped, regular };
enum TypeOfCar = {compact, handicapped, regular };


class Space
{
TypeOfSpace type;
bool empty;
// gets and sets here
// make sure car type
}


class car
{
TypeOfCar type;
}

模型不是孤立存在的。你定义的汽车进入停车场的模拟结构、引导你进入自由空间的嵌入式系统、停车场收费系统或停车场通常使用的自动登机口/售票机的结构都是不同的。

public class ParkingLot
{
Vector<ParkingSpace> vacantParkingSpaces = null;
Vector<ParkingSpace> fullParkingSpaces = null;


int parkingSpaceCount = 0;


boolean isFull;
boolean isEmpty;


ParkingSpace findNearestVacant(ParkingType type)
{
Iterator<ParkingSpace> itr = vacantParkingSpaces.iterator();


while(itr.hasNext())
{
ParkingSpace parkingSpace = itr.next();


if(parkingSpace.parkingType == type)
{
return parkingSpace;
}
}
return null;
}


void parkVehicle(ParkingType type, Vehicle vehicle)
{
if(!isFull())
{
ParkingSpace parkingSpace = findNearestVacant(type);


if(parkingSpace != null)
{
parkingSpace.vehicle = vehicle;
parkingSpace.isVacant = false;


vacantParkingSpaces.remove(parkingSpace);
fullParkingSpaces.add(parkingSpace);


if(fullParkingSpaces.size() == parkingSpaceCount)
isFull = true;


isEmpty = false;
}
}
}


void releaseVehicle(Vehicle vehicle)
{
if(!isEmpty())
{
Iterator<ParkingSpace> itr = fullParkingSpaces.iterator();


while(itr.hasNext())
{
ParkingSpace parkingSpace = itr.next();


if(parkingSpace.vehicle.equals(vehicle))
{
fullParkingSpaces.remove(parkingSpace);
vacantParkingSpaces.add(parkingSpace);


parkingSpace.isVacant = true;
parkingSpace.vehicle = null;


if(vacantParkingSpaces.size() == parkingSpaceCount)
isEmpty = true;


isFull = false;
}
}
}
}


boolean isFull()
{
return isFull;
}


boolean isEmpty()
{
return isEmpty;
}
}


public class ParkingSpace
{
boolean isVacant;
Vehicle vehicle;
ParkingType parkingType;
int distance;
}


public class Vehicle
{
int num;
}


public enum ParkingType
{
REGULAR,
HANDICAPPED,
COMPACT,
MAX_PARKING_TYPE,
}