Заполнитель класса, который можно заполнить позже? - PullRequest
0 голосов
/ 13 июля 2020

ОБНОВЛЕНИЕ: я больше не собираюсь реализовывать 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, специфичных для типа, для обновления общего заполнителя?

1 Ответ

0 голосов
/ 13 июля 2020

Вы можете сделать следующее:

public interface IUpdateRequest<T> {
    T Update(IPlaceholder<T> t);
}

public interface IPlaceholder<T>
{
    public bool Placeholder { get; set; }
    public T UpdateValues(IUpdateRequest<T> updateRequest);
}

public abstract class PlacheholderBase<T>
{
    public virtual bool Placeholder {get;set;}
    public T UpdateValues(IUpdateRequest<T> updateRequest) => updateRequest.Update(this);
 
}

public class SensorData : PlaceholderBase<SensorData>
{
    public decimal? Sensor1 { get; set; } = null;
    public decimal? Sensor2 { get; set; } = null;
    public DateTime ReceiveTime { 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;
    }
    
}

public class SensorDataUpdateRequest : IUpdateRequest<SensorData>
{
     public decimal Sensor1 {get;set;}
     public decimal Sensor2 {get;set;}
     public DateTime ReceiveTime {get;set;}

     public SensorData Update(SensorData s) {
        s.Sensor1 = this.Sensor1;
        s.Sensor2 = this.Sensor2;
        s.ReceiveTime = this.ReceiveTime;
        s.Placeholder = false;
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...