簡體   English   中英

C#:將基礎 class 集合對象復制到派生的 class 對象中

[英]C#: copy base class collection objects into derived class objects

我有如下基類和派生類(這只是一個例子):

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 構造函數使用基本構造函數來加載航點文件。 派生的 class 中的行程自然仍為空。 我正計划將 base.trips 復制到派生的旅行中。

兩個問題:

  1. 是復制處理這種情況的標准方法嗎? 如果基礎 Trip class 有很多成員和 collections,那么復制所有成員可能會很痛苦。

  2. 如果復制是標准方法,那么我基本上將 memory 的使用量加倍。 (base.trips 可能非常大。)看來我可以做 base.trips.Clear() 來釋放這些資源。 如果有正確的方法?

這就是 generics 的用途。 不是在每個子類中都有一個不同類型的旅行列表,而是在基類中有一個包含泛型類型的列表:

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
    }
}

這樣您就不需要為每個 class 重新聲明該屬性,而只需為從Base_Trip派生的所有類型提供一個定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM