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

В настоящее время я работаю с базовым классом под названием "JourneyLeg" .Этот базовый класс имеет 5 производных, которые все наследуются от базового класса.два из этих классов называются "WalkingLeg" и "VehicleLeg" .Эти 2 производных класса содержат поля "от" и "до" .Остальные 3 - нет.

List<JourneyLeg> legs

Теперь у меня есть список со всеми видами производных объектов.Некоторые из них - Walkingleg, некоторые из них - Vehicleleg, а остальные - один из 3 других производных классов.Список определен, как указано выше.

Я хочу пройтись по всему списку и выполнять действия только для объектов для ходьбы и транспортных средств.Эти действия включают доступ к " из " и "к" .Эти 2 поля доступны только в этих 2 производных классах, но не в базовом классе.

Единственный способ, о котором я могу думать, - это проверить, является ли он одним из 2 производных классов, и затем выполнить действия (см. Ниже).Но так у меня так много дублирующего кода.Я думаю, что я не могу извлечь дубликат кода в методе, потому что тогда объект параметра, который мы даем этому методу, был бы VehicleLeg или WalkingLeg и не может быть и тем и другим.,Но я не могу обернуть голову вокруг этого.Я надеюсь, что кто-то может вернуть меня на правильный путь.

Ниже приведены классы:

/// <summary>
/// JourneyLeg is the base class used to define commonalities between:
/// 
/// *VehicleLeg, WalkingLeg, TransitionLeg, AdvertisementLeg*
/// </summary>
public class JourneyLeg
{
    [Required]
    public string Id { get; set; }
    [Required]
    public LegType Type { get; set; }
}
/// <summary>
/// Vehicle leg model
/// </summary>
public class VehicleLeg : JourneyLeg
{
    [Required]
    public ModalityType Modality { get; set; }
    [Required]
    public LegStop From { get; set; }
    [Required]
    public LegStop To { get; set; }
}
/// <summary>
/// Walking leg model
/// </summary>
public class WalkingLeg : JourneyLeg
{
    [Required]
    public LegStop From { get; set; }
    [Required]
    public LegStop To { get; set; }
    /// <summary>
    /// Displays the total walk time in minutes and in parenthese the distance in meters
    /// </summary>
    [Required]
    public string Description { get; set; }
}

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Я бы просто добавил промежуточный класс, который добавляет свойства From и To:

public class JourneyLeg
{
    [Required]
    public string Id { get; set; }

    [Required]
    public LegType Type { get; set; }
}

// You may want another name...
public class JourneyFromToLeg : JourneyLeg
{
    [Required]
    public LegStop From { get; set; }

    [Required]
    public LegStop To { get; set; }
}

public class VehicleLeg : JourneyFromToLeg 
{
    [Required]
    public ModalityType Modality { get; set; }
}

public class WalkingLeg : JourneyFromToLeg 
{
    [Required]
    public string Description { get; set; }
}

Так что вы можете использовать:

case JourneyFromToLeg fromToLeg:
{
    var legTo = new DirectionsRequestJourneyLegsLocation(fromToLeg.To.LatLong, fromToLeg.To.IsVisible);
    var legFrom = new DirectionsRequestJourneyLegsLocation(fromToLeg.From.LatLong, fromToLeg.From.IsVisible);


    directionsRequestJourneyleg.id = fromToLeg.Id;
    directionsRequestJourneyleg.From = legFrom;
    directionsRequestJourneyleg.To = legTo;
    directionsRequestJourneyleg.LegArrival = fromToLeg.From.Time.Planned;
    directionsRequestJourneyleg.LegDeparture = fromToLeg.To.Time.Planned;

    // you may want to think a little more of this too
    if (fromToLeg is WalkingLeg)
    {
        directionsRequestJourneyleg.Type = DirectionsRequestJourneyLegType.Walking;
    }
    else
    {
        directionsRequestJourneyleg.Type = DirectionsRequestJourneyLegType.Vehicle;
        directionsRequestJourneyleg.Modality = ((VehicleLeg)fromToLeg).Modality;            
    }

    break;
}

В противном случае вы могли бы иметьIFromLeg / IToLeg / IFromToLeg интерфейсы, если вы предпочитаете использовать наследование интерфейса

0 голосов
/ 02 декабря 2018

Создайте новый класс JourneyLegFromTo или аналогичный, который наследует JourneyLeg, затем VehicleLeg и WalkingLeg наследуют новый класс.

Затем вы можете сократить код до проверки, является ли онJouneyLegFromTo вместо двух случаев, и вы сможете получить доступ к полям from и двум.

public class JourneyLegFromTo : JourneyLeg
{
    [Required]
    public LegStop From { get; set; }
    [Required]
    public LegStop To { get; set; }
}

public class WalkingLeg : JourneyLegFromTo 
{
    ...
}

public class VehicleLeg : JourneyLegFromTo 
{
    ...
}

Позже:

case JourneyLegFromTo journeyLegFromTo:
{
    var legTo = new DirectionsRequestJourneyLegsLocation(journeyLegFromTo.To.LatLong, journeyLegFromTo.To.IsVisible);
    var legFrom = new DirectionsRequestJourneyLegsLocation(journeyLegFromTo.From.LatLong, journeyLegFromTo.From.IsVisible);
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...