Как получить универсальный тип, наследуемый от универсального типа - PullRequest
0 голосов
/ 19 ноября 2010

У меня есть абстрактный класс:

public abstract class LMManager<ENTITY, ILM_ENTITY> where ENTITY : ILM_ENTITY, IActiveRecord, ICallOnCreated, new( )

ENTITY - это некоторый тип DataObject, ILM_ENTITY, IActiveRecord и ICallOnCreated - интерфейсы, которые реализует DataObject.

Как правило, я делаю подкласс этого парня с классами что-то вроде

public class JobManager : LMManager<Job, ILMJob>
public class JobViewManager : LMManager<vwJob, ILMJobView>

Теперь у меня есть случай, когда два подкласса имеют некоторый общий код, поэтому я хочу вставить еще один слой между ними, что-то вроде

public abstract class JobManagerBase : LMManager<ENTITY, ILM_ENTITY>

и затем измените двух других парней на

public class JobManager : JobManagerBase<Job, ILMJob>
public class JobViewManager : JobManagerBase<vwJob, ILMJobView>

В определении моего JobManagerBase я получаю четыре ошибки, связанные с ENTITY:

  1. Должен быть неабстрактным типом с открытым конструктором без параметров
  2. Нет преобразования в бокс или преобразования параметров типа из ENTITY в ICallOnCreated
  3. Нет преобразования в бокс или преобразования параметров типа из ENTITY в IActiveRecord
  4. Нет преобразования в бокс или преобразования параметров типа из ENTITY в ILM_ENTITY

Страшно очевидно, чего мне не хватает?

1 Ответ

0 голосов
/ 19 ноября 2010

Ваш JobManagerBase пытается использовать LMManager с параметрами ENTITY и ILM_ENTITY.
Поскольку эти параметры не соответствуют вашим ограничениям, вы получите сообщение об ошибке. (Что если кто-то сделает JobManagerBase<int, string>?)

Вам необходимо добавить общие параметры и то же самое предложение where к JobManagerBase, чтобы гарантировать, что его параметры соответствуют ограничениям, требуемым для LMManager.

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