используя методы производного класса в базовом классе - PullRequest
0 голосов
/ 02 мая 2018

в своей работе я пытаюсь написать систему управления гаражом. есть автомобиль абстрактного класса (у него есть список колес (также класс), двигатель и другие неважные параметры), автомобиль является производным от Vihecle, (также мотоцикл) и работа автомобиля на топливе, работа автомобиля на электричестве получена из автомобиля. (То же самое для мотоцикла).

каждый автомобиль имеет другой двигатель, поэтому в конструкторе я использую i_Engine (который внутри Engine) = новый WorkedOnFuel (WorkedOnFuel.eFuelType.Soler, 0, 115);

каждый из классов WorkedOnFuel / WorkedOnElectricity имеет свой собственный метод добавления энергии к своему собственному двигателю (для топлива требуется тип топлива и расход литров, для добавления электричества нужны часы плавания).

есть ли возможность разыграть и использовать эти методы?

Примечание: я не могу использовать интерфейс!

я добавляю сюда коды по классам:

public abstract class Vehicle
{


    private string m_ModelName;
    private string m_LicenseNumber;
    private List<Wheel> m_Wheels;
    private Engine m_Engine;

    public Vehicle(string i_ModelName, string i_LicenseNumber)
    {
        m_ModelName = i_ModelName;
        m_LicenseNumber = i_LicenseNumber;
        m_Wheels = new List<Wheel>();
    }

    public Engine i_Engine
    {
        get
        {
            return m_Engine;
        }
        set
        {
            m_Engine = value;
        }
    }

    public List<Wheel> i_Wheels
    {
        get
        {
            return m_Wheels;
        }
        set
        {
            m_Wheels = value;
        }
    }

    public string i_ModelName
    {
        get
        {
            return m_ModelName;
        }
        set
        {
            m_ModelName = value;
        }
    }

    public string i_LicenseNumber
    {
        get
        {
            return m_LicenseNumber;
        }
        set
        {
            m_LicenseNumber = value;
        }
    }
}

}

public abstract class Engine
{
    private float m_Current;
    private float m_Max;
    private float m_PercentageOfEnergyLeft;

    public Engine(float i_Current, float i_Max)
    {
        m_Current = i_Current;
        m_Max = i_Max;
        m_PercentageOfEnergyLeft = 0;
    }

    public float i_Current
    {
        get
        {
            return m_Current;
        }
        set
        {
            m_Current = value;
        }
    }

    public float i_Max
    {
        get
        {
            return m_Max;
        }
        set
        {
            m_Max = value;
        }
    }

    public float i_PercentageOfEnergyLeft
    {
        get
        {
            return m_PercentageOfEnergyLeft;
        }
        set
        {
            m_PercentageOfEnergyLeft = value;
        }
    }



}

}

public class WorkedOnFuel : Engine
{
    public enum eFuelType
    {
        Soler,
        Octan95,
        Octan96,
        Octan98
    }

    private float m_CurrentFuelAmount;
    private float m_MaxFuelAmount;
    private eFuelType m_FuelType;

    public WorkedOnFuel(eFuelType i_Fueltype, float i_CurrentFuelAmount, float i_MaxFuelAmount) : base(i_CurrentFuelAmount,i_MaxFuelAmount)
    {
        m_FuelType = i_Fueltype;
        m_CurrentFuelAmount = i_CurrentFuelAmount;
        m_MaxFuelAmount = i_MaxFuelAmount;
    }

    public eFuelType i_Fueltype
    {
        get
        {
            return m_FuelType;
        }
        set
        {
            m_FuelType = value;
        }
    }

    public float i_CurrentFuelAmount
    {
        get
        {
            return m_CurrentFuelAmount;
        }
        set
        {
            m_CurrentFuelAmount = value ;
        }
    }

    public float i_MaxFuelAmount
    {
        get
        {
            return m_MaxFuelAmount;
        }
        set
        {
            m_MaxFuelAmount = value;
        }
    }
    public virtual void AddEnergyToEngine(eFuelType i_Type, float i_FuelAmountForAdd)
    {
        if (i_Type == i_Fueltype && i_CurrentFuelAmount + i_FuelAmountForAdd <= i_MaxFuelAmount)

        {
            i_CurrentFuelAmount += i_FuelAmountForAdd;
            i_PercentageOfEnergyLeft = i_CurrentFuelAmount / i_MaxFuelAmount;
        }
    }
}

}

public class WorkedOnElectricity : Engine
{
    private float m_BatteryTime;
    private float m_MaxBatteryTime;

    public WorkedOnElectricity(float i_BatteryTime, float i_MaxBatteryTime): base(i_BatteryTime,i_MaxBatteryTime)
    {
        m_BatteryTime = i_BatteryTime;
        m_MaxBatteryTime = i_MaxBatteryTime;

    }

    public float i_BatteryTime
    {
        get
        {
            return m_BatteryTime;
        }
        set
        {
            m_BatteryTime = value;
        }
    }

    public float i_MaxBatteryTime
    {
        get
        {
            return m_MaxBatteryTime;
        }
        set
        {
            m_MaxBatteryTime = value;
        }
    }

    public virtual void AddEnergyToEngine(float i_HoursToAddTobattery)
    {
        if ((m_BatteryTime + i_HoursToAddTobattery) <= m_MaxBatteryTime)
        {
            i_MaxBatteryTime += i_HoursToAddTobattery;
            i_PercentageOfEnergyLeft = i_BatteryTime / i_MaxBatteryTime;
        }
    }


}

}

результат, который мне нужен, заключается в том, что когда я поступаю в основной программе Автомобиль v = новый FuelCar (...) v.i_Engine .---- плохо получу методы электричества / топлива по типу машины автомобиля (которая была встроена в конструктор.

класс топлива автомобиля:

public class FuelCar : Car
{
    private float m_CurrentFuelAmountInCar;

    public FuelCar(string i_ModelName, string i_LicenseNumber, int i_NumberOfDoors, eColor i_ColorType, float i_CurrentPressureInWheel, 
        float i_CurrentFuelAmountInCar): base(i_ModelName, i_LicenseNumber,i_NumberOfDoors,i_ColorType,i_CurrentPressureInWheel)
    {
        i_Engine =  new WorkedOnFuel(WorkedOnFuel.eFuelType.Octan98, 0, 45);
        i_Engine.i_Current = i_CurrentFuelAmountInCar; // עידכון כמות הדלק 
        i_Engine.i_PercentageOfEnergyLeft = i_CurrentFuelAmountInCar / i_Engine.i_Max; // חישוב אחוז שנשאר במנוע 
    }

    public float i_CurrentFuelAmountInCar
    {
        get
        {
            return m_CurrentFuelAmountInCar;
        }
        set
        {
            m_CurrentFuelAmountInCar = value;
        }
    }

}

}

большое спасибо за помощь и извините за мой английский и уточни вопрос! бен.

1 Ответ

0 голосов
/ 02 мая 2018

Я полагаю, что то, что вы просите, это "удрученный". C # имеет заявления, которые элегантно обрабатывают эту операцию, на мой взгляд. Оператор «as» может быть использован для определения типа объекта довольно легко. Кроме того, в классе Type есть метод IsInstanceOfType.

Документация для оператора "as": https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/as

Документация для метода "IsInstanceOfType": https://msdn.microsoft.com/en-us/library/system.type.isinstanceoftype%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

Использование оператора «как» для определения типа производного класса и, таким образом, дает возможность вызывать методы производного класса выглядит следующим образом:

Vehicle vehicle1 = new FuelCar(...);
Vehicle vehicle2 = new ElectricCar(...);
.
.
.
FuelCar fuelCar = vehicle1 as FuelCar;
if (fuelCar != null)
{
    fuelCar.CallAFuelCarMethod();
}

ElectricCar electricCar = vehicle2 as ElectricCar;
if (electricCar != null)
{
    electricCar.CallAnElectricCarMethod();
}
.
.
.

Использование метода IsInstanceOfType аналогично:

if (vehicle.GetType().IsInstanceOfType(typeof(FuelCar))
{
    .
    .
    .
}

Есть, вероятно, другие методы; Однако эти два простых решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...