ОБНОВЛЕНИЕ: я больше не собираюсь реализовывать logi c, описанный ниже, я вообще использовал другую реализацию.
Предположим, у меня есть коллекция, которую я инициализирую параметром buffer
, представляющим количество элементов, которые коллекция должна всегда содержать. После создания я хотел бы заполнить его заполнителями, пока не будут добавлены «настоящие» значения или экземпляры. Когда добавляется реальное значение, я хочу, чтобы самое старое значение-заполнитель обновляло свои значения, чтобы они соответствовали значению «добавленного» значения, вместо того, чтобы физически добавлять новые данные в коллекцию.
Для этого я думал, что могу напишите интерфейс IPlaceholder
, который примерно делает что-то вроде этого:
public interface IPlaceholder<T>
{
public bool Placeholder { get; set; }
public void UpdateValues(/* type specific constructor parameters? */);
// public void UpdateValues(object[] params) is a last resort
}
Например, я мог бы использовать буфер для данных, которые я получаю от датчика, чтобы отслеживать, как данные датчика изменились за последний 10 минут:
public class SensorData : IPlaceholder<SensorData>
{
public decimal? Sensor1 { get; set; } = null;
public decimal? Sensor2 { get; set; } = null;
public DateTime ReceiveTime { get; set; }
public bool Placeholder { get; set; }
public SensorData()
{
Placeholder = true;
ReceiveTime = DateTime.Now;
}
public SensorData(DateTime t)
{
Placeholder = true;
ReceiveTime = t;
}
public SensorData(decimal s1, decimal s2, DateTime t)
{
Sensor1 = s1;
Sensor2 = s2;
ReceiveTime = t;
Placeholder = false;
}
// Use any of the possible constructor signatures as class?
public void UpdateValues(decimal s1, decimal s2, DateTime t)
{
Sensor1 = s1;
Sensor2 = s2;
ReceiveTime = t;
Placeholder = false;
}
}
Или у меня может быть набор участников гонки, которые, как я знаю, должны финишировать sh, поэтому буфер представляет порядок, в котором участники финишировали.
public class Racer : IPlaceholder<Racer>
{
public string Name { get; set; } = null;
public string RacerCar { get; set; } = null;
public bool Placeholder { get; set; }
public Racer()
{
Placeholder = true;
}
public Racer(string name, string racerCar)
{
Name = name;
RacerCar = racerCar;
PlaceHolder = false;
}
// Use any of the possible constructor signatures as class?
public void UpdateValues(string name, string racerCar)
{
Name = name;
RacerCar = racerCar;
}
}
Идея состоит в том, что я могу инициализировать коллекцию, учитывая количество заполнителей, которые заполняются, когда фактические данные начинают поступать:
var racerCount = 6;
var racers = new CustomCollection<Racer>(racerCount); // Initializes 6 placeholder Racer objects
// Actual racers:
var john = new Racer("John Lennon", "Lucy");
var paul = new Racer("Paul McCartney", "Michelle");
var ringo = new Racer("Ringo Starr", "Octopus");
var george = new Racer("George Harrison", "Blue Jay");
var brian = new Racer("Brian Epstein", "Seltaeb");
var yoko = new Racer("Yoko Ono", "Samantha");
racers.Add(john);
/* John Finishes first
=> calls racers.Where(x => x.Placeholder).First()
.UpdateValues(john.Name, john.RacerCar)
or something
*/
etc.
Для примера датчика я бы, вероятно, также добавить функциональность для добавления к нему новых данных, и в этом случае самые старые данные удаляются, а все существующие данные возвращаются на более поздний срок st данные датчика.
Есть ли способ реализовать интерфейс для размещения параметров конструкции c, специфичных для типа, для обновления общего заполнителя?