设计一个OO停车场。它将具有哪些类和功能。应该说满了,空了,还可以找到代客泊车的地方。该停车场有3种不同类型的停车位:常规,残疾人和紧凑型。
谢谢!
设计一个OO停车场。它将具有哪些类和功能。应该说满了,空了,还可以找到代客泊车的地方。该停车场有3种不同类型的停车位:常规,残疾人和紧凑型。
谢谢!
Answers:
这是使齿轮转动的快速入门...
ParkingLot是一类。
ParkingSpace是一类。
ParkingSpace有一个入口。
入口有一个位置,或更确切地说是与入口的距离。
ParkingLotSign是一个类。
ParkingLot有一个ParkingLotSign。
ParkingLot具有有限数量的ParkingSpaces。
HandicappedParkingSpace是ParkingSpace的子类。
RegularParkingSpace是ParkingSpace的子类。
CompactParkingSpace是ParkingSpace的子类。
ParkingLot保留了一系列的ParkingSpaces,以及一个单独的闲置的ParkingSpaces,这些空间与距其入口的距离顺序相同。
通过调用.Full()、. Empty()或.Normal(),可以告诉ParkingLotSign显示“满”,“空”或“空白/正常/部分占用”。
帕克是一类。
派克可以Park()。
派克可以Unpark()。
Valet是Parker的子类,可以调用ParkingLot.FindVacantSpaceNearestEntrance(),该函数返回ParkingSpace。
帕克有一个ParkingSpace。
派克可以调用ParkingSpace.Take()和ParkingSpace.Vacate()。
派克会调用Entrance.Entering()和Entrance.Exiting(),ParkingSpace会在有人拿走或腾空它时通知ParkingLot,以便ParkingLot可以确定它是否已满。如果它是新装满或新装满或新装满或装满的,则应更改ParkingLotSign.Full()或ParkingLotSign.Empty()或ParkingLotSign.Normal()。
HandicappedParker可以是Parker的子类,CompactParker可以是Parker的子类,RegularParker可以是Parker的子类。(实际上可能是过大了。)
在此解决方案中,Parker有可能应重命名为Car。
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,
}
vacantParkingSpaces
不再进行排序。您必须对其进行排序,以便findNearestVacant
返回最近的停车位。
findNearestVacant
,而其实现只能找到一个空闲空间,而不一定是“最近的”空间?为什么不使用“ findVacant”?尽管使用存储在类中的某些状态返回“最近”空间会很好。也许,我们可以将“入口”和“出口”之间的距离存储在“空间”类中,以便也可以计算“最近”,或者我们可以简单地计算空间的坐标,从而使所有入口和出口之间的距离出口可以根据需要进行计算。
parkVehicle
应返回一个布尔值,指示车辆是否已停放。
模型不是孤立存在的。您为模拟进入停车场的汽车而定义的结构,可将您引导至自由空间的嵌入式系统,停车场计费系统或停车场中常见的自动门/票务机定义的结构都不同。
您将需要一个停车场,该停车场可容纳类型为“空间”的多维数组(在构造函数中指定)。停车场可以通过调用填充和清空空间的函数来跟踪占用了多少空间.Space可以容纳枚举类型,以告知其空间类型。太空也有一个taken()方法。对于代客泊车,只需找到第一个开放的空间,然后将汽车放在那里。您还需要将Car对象放入空间中,该对象可以容纳残疾人,紧凑型或常规车辆。
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;
}