C # абстрактные классы - PullRequest
       17

C # абстрактные классы

1 голос
/ 27 апреля 2011

Мне нужно создать поддельную программу DMV, которая рассчитывает ежегодные сборы для коммерческих и частных транспортных средств.Эти два класса будут абстрактными, и они будут полиморфизмом из класса, названного всеми транспортными средствами.

Мой преподаватель хочет, чтобы только один объект создал всю программу (в основном), но так как мои лучшие 3 уровня классов являются абстрактными.Я не могу создать объект с ними, т.е. Vehicles = New Vehicles ();

, поэтому мой вопрос, как я могу создать только один объект, поскольку они являются абстрактными?Если у вас есть какие-либо вопросы, не стесняйтесь спрашивать, я бы не объяснил это хорошо ...

Ответы [ 4 ]

0 голосов
/ 27 апреля 2011

Структура вашего класса будет выглядеть примерно так:

abstract class Vehicle
{
    protected abstract int BaseFee { get; }
    protected abstract int ExtraFee { get; }

    public int CalculateFee()
    {
        return BaseFee + ExtraFee;
    }
}

abstract class CommercialVehicle : Vehicle
{
    protected override int BaseFee
    {
        return 100;
    }
}

class LightDutyTruck : CommercialVehicle
{
    protected override int ExtraFee
    {
        return 50;
    }
}

class Semi : CommercialVehicle
{
    protected override int ExtraFee
    {
        return 150;
    }
}

[etc...]

abstract class PrivateVehicle : Vehicle
{
    protected override int BaseFee
    {
        return 25;
    }
}

class Sedan : PrivateVehicle
{
    protected override int ExtraFee
    {
        return 15;
    }
}

и так далее для каждого класса.В вашем методе Main вы должны создать экземпляр на основе ввода, но ваша фактическая переменная будет объявлена ​​как тип Vehicle.Фактический расчет вступит в силу на основе созданного вами экземпляра:

Vehicle v;
switch(input)
{
    case "semi":
        v = new Semi();
        break;
    case "truck":
        v = new LightDutyTruck();
        break;
    ...
}

int fee = v.CalculateFee();
0 голосов
/ 27 апреля 2011

Возможно, вам нужно создать один объект, который представляет DMV, но определение этого объекта включает в себя экземпляры других объектов.

class DMV {
 private List<Vehicle> vehicles = new List<Vehicle>();
 ...
}
0 голосов
/ 27 апреля 2011

Ваш инструктор может потребовать, чтобы вы создали несколько объектов через ссылку на абстрактный базовый класс:

Vehicle conveyance;
conveyance = new PrivateVehcicle();
conveyance.Drive();
conveyance.Stop();
// or whatever ...
conveyance = new CommercialVehcicle();
conveyance.Drive();
conveyance.Stop();

т.е. у вас есть одна ссылка на объект (транспортировка), которая ведет себя полиморфно в зависимости от конкретного типа, который вы 'Ве экземпляр.

0 голосов
/ 27 апреля 2011

Вы, кажется, немного смущены. «Все транспортные средства» должны быть абстрактными. «Коммерческий автомобиль» и «Частный автомобиль» не должны быть абстрактными, если только у них нет конкретных подклассов.

Вы также можете не понимать, что ваш инструктор подразумевает под "только одним предметом", поскольку это не имеет смысла.

...