OOGenerics Дизайн Соображения - PullRequest
2 голосов
/ 17 марта 2009

Вот ситуация, для которой я пытаюсь найти подходящий дизайн.

Мне нужно хранить профили номеров. Профиль - это просто серия чисел. Они могут иметь тип int, float или десятичный тип. Каждый профиль имеет поле ProfileDescription, основанное на нумерации.

Каждый профиль имеет коллекцию объектов ProfileVersion. Каждый объект ProfileVersion имеет коллекцию объектов ProfileValue. Эти объекты ProfileValue хранят фактические числовые значения требуемого типа.

Моя первоначальная идея заключалась в том, чтобы сделать Profile, ProfileVersion и ProfileValue общими. Я сталкиваюсь с проблемой, когда хочу иметь список профилей разных типов, которых у меня не может быть. Вместо этого я мог бы использовать ArrayList, но тогда мне пришлось бы преобразовать данные в нем.

Хотя я мог бы сделать общие ProfileVersion и ProfileValue универсальными, а затем заставить объект профиля назначать тип ProfileVersion в зависимости от значения поля ProfileDescription, но я не могу найти способ сделать это.

Еще одна мысль заключалась в том, что мне следует использовать класс ProfileBase, а затем создать его подкласс с помощью GenericProfileClass или IntProfile, FloatProfile и DecimalProfile, но это на самом деле не даст мне никакого преимущества по сравнению с тем, чтобы каждый класс был универсальным, как я должен был бы привести в любом случае, каждый раз из подкласса.

Буду признателен за ваши мысли о наилучшем подходе к дизайну в этой ситуации.

Спасибо

Ответы [ 2 ]

2 голосов
/ 17 марта 2009

Идея Грзенио верна. Каждый из классов вашего профиля можно сделать реализацией объекта IProfile, и тогда ваш контейнер может быть:

class ProfileList : IList<T> where T: IProfile

Таким образом, единственным ограничением, которое у вас будет, является интерфейс, а не конкретный тип или приведенный базовый класс.

Что касается:

Еще одна мысль была, я должен использовать Класс ProfileBase, а затем подкласс его либо с GenericProfileClass или IntProfile, FloatProfile и DecimalProfile, но это не действительно дать мне какое-либо преимущество перед имея каждый класс, как я придется изгнать подкласс в любом случае каждый раз.

Преимущества действительно будут зависеть от уровня абстракций, которые вы делаете для своих классов. При правильной разработке вы можете в идеале иметь классы операций / бизнес-логики / или менеджеров, которые могут принимать любой из этих базовых типов (опять же через универсальные шаблоны) без необходимости знать конкретное приведение.

1 голос
/ 17 марта 2009

Я не уверен, правильно ли я понимаю вашу проблему (вставка кода, который не работает, поможет), но я думаю, что вы можете попытаться создать интерфейсы IProfile, IProfileVersion и т. Д. И сделать общий класс наследуют интерфейс Profile<T>:IProfile.

То, что вы пытаетесь сделать, непросто, так как, к сожалению, в C # нет базового числового типа.

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