C#:将基础 class 集合对象复制到派生 class 对象中
C#: copy base class collection objects into derived class objects
我有基础和派生的 classes 如下(这只是一个例子):
class Base_TripLog {
public List<Base_Trip> trips = ...
public Base_TripLog(string log_filename) {
// load stuff into trips
}
}
class Base_Trip {
public string vehicle_id = ...;
public Dictionary<ulong, Base_Waypoint> waypoints = ...
public Base_Trip() {
}
public add_waypoint(ulong epoch_sec, Base_Waypoint waypoint) {
waypoints.Add(epoch_sec, waypoint);
}
}
class Base_Waypoint {
/// time and gps coords
}
class Derived_TripLog : Base_TripLog {
public string company_name;
public new List<Derived_Trip> trips = ...
public Derived_TripLog(string company_name, string filename) : base(filename) {
this.company_name = company_name;
if (trips.Count > 0) {
// do stuff
}
}
}
class Derived_Trip : Base_Trip {
public int duration_sec;
public Derived_Trip() : base() {
duration = compute_trip_duration(waypoints)
}
}
Derived_TripLog 构造函数使用基本构造函数加载 waypoints 的文件。派生的 class 中的行程自然仍然是空的。我正计划将 base.trips 复制到派生旅行中。
两个问题:
复制是处理这种情况的标准方式吗?如果基础 Trip class 有很多成员和集合,复制所有成员可能会很痛苦。
如果复制是标准方法,那么我实际上是在加倍内存使用。 (base.trips 可能非常大。)看来我可以做 base.trips.Clear() 来释放这些资源。有没有正确的方法?
这就是泛型的用途。不是在每个 child-class 中都有一个不同类型的旅行列表,而是在 base-class:
中有一个通用类型的列表
class Base_TripLog<TripType> where TripType: Base_Trip {
public List<TripType> trips = ...
public Base_TripLog(string log_filename) {
// load stuff into trips
}
}
现在您可以使用正确的通用参数继承此 class:
class Derived_TripLog : Base_TripLog<Derived_Trip>
{
public string company_name;
public Derived_TripLog(string company_name, string filename) : base(filename)
{
this.company_name = company_name;
if (trips.Count > 0) {
// do stuff
}
}
这样您就不需要 re-declare 每个 class 的 属性,而只需对从 Base_Trip
派生的所有类型进行单一定义。
我有基础和派生的 classes 如下(这只是一个例子):
class Base_TripLog {
public List<Base_Trip> trips = ...
public Base_TripLog(string log_filename) {
// load stuff into trips
}
}
class Base_Trip {
public string vehicle_id = ...;
public Dictionary<ulong, Base_Waypoint> waypoints = ...
public Base_Trip() {
}
public add_waypoint(ulong epoch_sec, Base_Waypoint waypoint) {
waypoints.Add(epoch_sec, waypoint);
}
}
class Base_Waypoint {
/// time and gps coords
}
class Derived_TripLog : Base_TripLog {
public string company_name;
public new List<Derived_Trip> trips = ...
public Derived_TripLog(string company_name, string filename) : base(filename) {
this.company_name = company_name;
if (trips.Count > 0) {
// do stuff
}
}
}
class Derived_Trip : Base_Trip {
public int duration_sec;
public Derived_Trip() : base() {
duration = compute_trip_duration(waypoints)
}
}
Derived_TripLog 构造函数使用基本构造函数加载 waypoints 的文件。派生的 class 中的行程自然仍然是空的。我正计划将 base.trips 复制到派生旅行中。
两个问题:
复制是处理这种情况的标准方式吗?如果基础 Trip class 有很多成员和集合,复制所有成员可能会很痛苦。
如果复制是标准方法,那么我实际上是在加倍内存使用。 (base.trips 可能非常大。)看来我可以做 base.trips.Clear() 来释放这些资源。有没有正确的方法?
这就是泛型的用途。不是在每个 child-class 中都有一个不同类型的旅行列表,而是在 base-class:
中有一个通用类型的列表class Base_TripLog<TripType> where TripType: Base_Trip {
public List<TripType> trips = ...
public Base_TripLog(string log_filename) {
// load stuff into trips
}
}
现在您可以使用正确的通用参数继承此 class:
class Derived_TripLog : Base_TripLog<Derived_Trip>
{
public string company_name;
public Derived_TripLog(string company_name, string filename) : base(filename)
{
this.company_name = company_name;
if (trips.Count > 0) {
// do stuff
}
}
这样您就不需要 re-declare 每个 class 的 属性,而只需对从 Base_Trip
派生的所有类型进行单一定义。