C#: копировать объекты коллекции базового класса в объекты производного класса - PullRequest
1 голос
/ 17 июня 2020

У меня есть базовый и производный классы следующим образом (это просто пример):

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 использует базовый конструктор для загрузки файла путевых точек. поездки в производном классе, естественно, останутся пустыми. Я планировал скопировать base.trips в производные поездки.

два вопроса:

  1. копирует стандартный способ справиться с этой ситуацией? если в базовом классе Trip было много членов и коллекций, было бы больно копировать все члены.

  2. если копирование является стандартным подходом, то я, по сути, удваиваю использование памяти . (base.trips может быть довольно большим.) Кажется, я мог бы просто сделать base.trips.Clear (), чтобы освободить эти ресурсы. если есть правильный путь?

1 Ответ

1 голос
/ 17 июня 2020

Вот для чего нужны дженерики. Вместо того, чтобы иметь список поездок разных типов в каждом дочернем классе, у вас есть один список с типом generi c в вашем базовом классе:

class Base_TripLog<TripType> where TripType: Base_Trip {
   public List<TripType> trips = ...

   public Base_TripLog(string log_filename) {
      // load stuff into trips
   }
}

Теперь вы можете просто унаследовать этот класс используя правильный аргумент generi c:

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

Таким образом, вам не нужно повторно объявлять свойство для каждого класса, а просто иметь одно определение для всех типов, производных от Base_Trip .

...