Применение значения переменной типа в качестве специального базового типа - PullRequest
1 голос
/ 29 мая 2011

Я реализовал свою модульную систему, заставив модули реализовывать абстрактный класс, который содержит обязательные методы, которые будут вызываться базовым приложением.Теперь я хочу реализовать форму конфигурации для каждого модуля.Я думал о возвращении типа формы в качестве свойства моего класса скелета модуля:

public abstract class Module
{
    public abstract Type ConfigurationForm { get; }
}

При отображении формы конфигурации я просто создаю экземпляр формы этого типа и вызываю метод Show().

Проблема в том, что я хочу заставить модуль возвращать тип, который является подклассом System.Windows.Forms.Form, так как в противном случае вызов не состоялся бы.Как правильно применить это?

Я думал об инкапсуляции свойства ConfigurationForm в другое свойство, которое проверяет, унаследовано ли оно от Form, но я не думаю, что это чистый способ достиженияэто.

Ответы [ 2 ]

6 голосов
/ 29 мая 2011

Вы можете сделать это с помощью параметра общего типа

public abstract class Module<F> where F : Form
{
    public Type ConfigurationForm { get { return typeof(F); } }
}

Но на самом деле это может иметь больше смысла:

public abstract class Module
{
    public abstract Form CreateConfigurationForm();
}

Редактировать: Преимущество использования 2-го варианта в том, что вы можете писать код для работы с вашим классом Module без необходимости точно знать, с каким типом модуля вы работаете

1 голос
/ 29 мая 2011

Нет способа ограничить функцию возвращением Type, который представляет тип, наследуемый от Form. Что вы можете сделать, чтобы вернуть форму напрямую:

public abstract Form CreateConfigurationForm();

или фабричный метод (или, альтернативно, фабричный класс):

public abstract Func<Form> ConfigurationFormCreator();

Другой вариант - использовать дженерики, как предложил erash.

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