2011-01-16 2 views
0

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

//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).

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

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

+0

Вы должны указать типы в Do(), потому что вы вызываете X.TOADate(). Компилятор должен знать, где найти метод TOADate(), поэтому он должен знать, какой тип X. –

+0

Добавлен литой (15 символов) – David

+0

Я не понимаю ваших требований. Почему именно вы хотите избавиться от явных аргументов типа в 'D()', если этот метод активно использует знания о них в любом случае? –

ответ

0

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

1

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

0

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

Смежные вопросы