【发布时间】:2019-05-03 23:21:48
【问题描述】:
目前我正在使用一个名为 “JourneyLeg” 的基类。这个基类有 5 个派生的,它们都继承自基类。其中两个类称为 "WalkingLeg" 和 "VehicleLeg"。这 2 个派生类都包含一个 "from" 和 "to" 字段。其他 3 个没有。
List<JourneyLeg> legs
我现在有一个列表,其中包含所有类型的派生对象。其中一些是Walkingleg,其中一些是车辆腿,其余的是其他3 个派生类之一。列表定义如上。
我想遍历完整列表并仅对步行和车辆对象执行操作。这些操作包括访问“from”和“to”。这 2 个字段仅在这 2 个派生类中可用,在基类中不可用。
我能想到的唯一方法是检查它是否是 2 个派生类之一,然后执行操作(见下文)。但是这样我就有很多重复的代码。我认为我无法在方法中提取重复代码,因为我们为该方法提供的参数对象将是 VehicleLeg 或 WalkingLeg 并且不能两者兼而有之。
case VehicleLeg vehicleLeg:
{
var legTo = new DirectionsRequestJourneyLegsLocation(vehicleLeg.To.LatLong, vehicleLeg.To.IsVisible);
var legFrom = new DirectionsRequestJourneyLegsLocation(vehicleLeg.From.LatLong, vehicleLeg.From.IsVisible);
directionsRequestJourneyleg.id = vehicleLeg.Id;
directionsRequestJourneyleg.From = legFrom;
directionsRequestJourneyleg.To = legTo;
directionsRequestJourneyleg.LegArrival = vehicleLeg.From.Time.Planned;
directionsRequestJourneyleg.LegDeparture = vehicleLeg.To.Time.Planned;
directionsRequestJourneyleg.Type = DirectionsRequestJourneyLegType.Vehicle;
directionsRequestJourneyleg.Modality = vehicleLeg.Modality;
break;
}
case WalkingLeg walkingLeg:
{
var legTo = new DirectionsRequestJourneyLegsLocation(walkingLeg.To.LatLong, walkingLeg.To.IsVisible);
var legFrom = new DirectionsRequestJourneyLegsLocation(walkingLeg.From.LatLong, walkingLeg.From.IsVisible);
directionsRequestJourneyleg.id = walkingLeg.Id;
directionsRequestJourneyleg.From = legFrom;
directionsRequestJourneyleg.To = legTo;
directionsRequestJourneyleg.LegArrival = walkingLeg.From.Time.Planned;
directionsRequestJourneyleg.LegDeparture = walkingLeg.To.Time.Planned;
directionsRequestJourneyleg.Type = DirectionsRequestJourneyLegType.Walking;
break;
}
我可能在这里遗漏了一些简单的东西。但我无法绕过它。我希望有人能让我重回正轨。
以下是课程:
/// <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; }
}
【问题讨论】:
-
最好使用接口继承而不是类继承——类上可以有多个接口(例如 Leg 和 Arm 可以有 IVehicle 接口,但它们有分离的 ILeg 和 IArm 接口)
标签: c# derived-class base-class