Chr*_*ley 155
这是一个让齿轮转动的快速入门......
ParkingLot是一个班级.
ParkingSpace是一个类.
ParkingSpace有一个入口.
入口有一个位置或更具体地说,距离入口的距离.
ParkingLotSign是一个班级.
ParkingLot有ParkingLotSign.
ParkingLot拥有有限数量的ParkingSpaces.
HandicappedParkingSpace是ParkingSpace的子类.
RegularParkingSpace是ParkingSpace的子类.
CompactParkingSpace是ParkingSpace的子类.
ParkingLot保留了一系列ParkingSpaces,以及一系列独立的ParkingSpaces,距离入口有一定距离.
可以通过调用.Full(),. Empty()或.Normal()来告知ParkingLotSign显示"full","empty"或"blank/normal/partial occupied"
帕克是一个班级.
派克可以停车().
派克可以Unpark().
Valet是Parker的子类,可以调用ParkingLot.FindVacantSpaceNearestEntrance(),它返回一个ParkingSpace.
帕克有一个停车位.
Parker可以调用ParkingSpace.Take()和ParkingSpace.Vacate().
Parker呼叫Entrance.Entering()和Entrance.Exiting()和ParkingSpace在停放时通知ParkingLot,以便ParkingLot可以确定它是否已满.如果它是新满或新空或新未满或空,则应更改ParkingLotSign.Full()或ParkingLotSign.Empty()或ParkingLotSign.Normal().
HandicappedParker可以是Parker的子类,CompactParker是Parker的子类,而ParkP的子类是RegularParker.(实际上可能有点矫枉过正了.)
在这个解决方案中,Parker可能会被重命名为Car.
小智 64
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,
}
Run Code Online (Sandbox Code Playgroud)
在面向对象的停车场,不需要服务员,因为汽车将"知道如何停车".
在这个地段找到一辆可用的汽车将很困难; 最常见的模型要么将所有活动部件暴露为公共成员变量,要么将是"完全封装"的汽车,没有窗户或门.
我们的OO停车场的停车位与汽车的大小和形状不匹配(空间与汽车之间的"阻碍不匹配")
我们地段的许可证标签在每个字母和数字之间都有一个点.Handicaped parking仅适用于以"_"开头的许可证,以及以"m_"开头的许可证将被拖走.
你需要一个停车场,它拥有一个"空间"类型的多维数组(在构造函数中指定).停车场可以通过调用填充和清空空间的函数来跟踪占用的空间数量.空间可以保持枚举类型,告诉它是什么类型的空间.空间也有一个方法().代客泊车,找到第一个打开的空间,把车放在那里.您还需要一个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;
}