亚马逊访谈问题:设计一个OO停车场

时间:2009-04-19 06:07:19

标签: oop

设计一个OO停车场。它将具有哪些类别和功能。它应该说,全,空,也能找到代客泊车的地方。该地段有3种不同类型的停车场:普通停车场,残疾人停车场和紧凑型停车场。

谢谢!

5 个答案:

答案 0 :(得分:145)

这是让齿轮转动的快速开始......

ParkingLot是一个班级。

ParkingSpace是一个班级。

ParkingSpace有一个入口。

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

ParkingLotSign是一个班级。

ParkingLot有ParkingLotSign。

ParkingLot拥有有限数量的停车位。

HandicappedParkingSpace是ParkingSpace的子类。

RegularParkingSpace是ParkingSpace的子类。

CompactParkingSpace是ParkingSpace的子类。

ParkingLot保留了一系列ParkingSpaces,以及一系列空置的ParkingSpaces,距离入口处的距离不远。

通过调用.Full(),. Empty()或.Normal()

,可以告诉ParkingLotSign显示“full”,“empty”或“blank / normal / partial occupied” 帕克是一个班级。

派克可以停车()。

Parker可以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。

答案 1 :(得分:63)

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,
}

答案 2 :(得分:10)

模型不是孤立存在的。您为进入停车场的汽车模拟定义的结构,引导您进入自由空间的嵌入式系统,停车计费系统或停车场中常见的自动门/售票机都是不同的。

答案 3 :(得分:5)

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

在这个地段找到一辆可用的汽车将很困难;最常见的模型要么将所有活动部件作为公共成员变量公开,要么将是“完全封装”的车辆,没有窗户或门。

我们OO停车场的停车位与汽车的大小和形状不符(空间和车厢之间的“阻碍不匹配”)

我们地段的许可证标签在每个字母和数字之间都有一个点。 Handicaped parking仅适用于以“_”开头的许可证,而以“m_”开头的许可证将被拖走。

答案 4 :(得分:5)

你需要一个停车场,它拥有一个“空间”类型的多维数组(在构造函数中指定)。停车场可以通过调用填充和清空空间的函数来跟踪占用的空间数量。空间可以保持枚举类型,告诉它是什么类型的空间。空间也有一个方法()。代客泊车,找到第一个打开的空间,把车放在那里。您还需要一个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;
}