C #: интерфейс с числом или датой - PullRequest
0 голосов
/ 16 января 2011

Моя проблема может быть упрощена до List <> с координатами X и Y, который я хотел бы сгруппировать в интерфейс или абстрактный класс.Затем у меня есть куча других функций, которые принимают этот абстрактный класс в качестве аргумента.Предостережение в том, что элемент X имеет числовой характер или является датой-временем.Вот пример кода, чтобы проиллюстрировать, что я пытаюсь сделать:

//C# 4.0
abstract class Element : Group<DateTime, double>
{
      public DateTime X {get; set;}
      public double Y {get; set;}
}

public interface Group<T, U>
{
      public T X {get; set;}
      public U Y {get; set;}
}

void OtherObject.Do(List<Group<DateTime, double>> elm)
{
     double[] X = 0;

     for (int i = 0; i < elm.Count; i++)
     {
        if (elm[i].GetType() == typeof(DateTime))
        {
           X[i] = ((DateTime)elm[i].X).TOADate();
        {
        else
        {
           X[i] = elm.X;
        }
     }

     //Other stuff
}

static Main()
{
     List<Element> list = FactoryCreate();
     OtherObject obj = new OtherObject();     

     obj.Do(list);
}    

Я хотел бы иметь возможность указать аргумент List<Group<DateTime, double>> для Do() без указания общих типов.Я просто хотел бы иметь возможность сделать Do(List<Group> lst).

Я мог бы просто исключить параметры универсального типа и использовать динамический тип данных в Группе, но я не думаю, что это лучший способ.

Существует ли установленный шаблон для решения этой проблемы?Я на 100% открыт для предложений относительно правильного способа моделирования этой структуры данных / класса.

Ответы [ 3 ]

1 голос
/ 16 января 2011

Вы можете создать неуниверсальный интерфейс IGroup со свойствами object и реализовать его явно.

0 голосов
/ 16 января 2011

Еще один момент: вы смешиваете здесь публичный интерфейс и внутреннюю реализацию.Это неправильный дизайн программного обеспечения.Ваш интерфейс должен просто определять операции для доступа к вашим данным, и эти операции должны быть независимы от внутреннего представления данных.Затем вы должны определить некоторые классы, реализующие этот интерфейс, то есть один с DateTime, а другой с double в качестве реального хранилища данных.Ничто из этого не должно использовать дженерики.

0 голосов
/ 16 января 2011

Я думаю, вы слишком усложнили это.Ваши DateTime и double оба делают одно и то же = они хранят дату и время, поэтому используйте один из них и при необходимости конвертируйте значения из другого типа.Или создайте свой собственный класс DateTimeOrDouble и поместите его вместо универсального параметра.Вы не можете использовать общие параметры, когда вам нужна дата или двойное число и вам нужно вызвать ToOADate ().Короче говоря: вообще не используйте общие параметры, потому что они вам не нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...