У меня есть абстрактный класс, который используется для получения десятков других классов, каждый класс делает похожие, но немного разные вещи. Этот класс загружается Reflection и отображается пользователю, чтобы выбрать, какой из них ему нужно запустить.Вызвать унаследованный метод из его базового класса
Эта работа, потому что базовый класс имеет абстрактный метод, называемый Run, который переопределяется каждым производным классом. Поэтому везде в коде, где мне нужна переменная любого из этих типов, я объявляю их как базовый класс. Затем, когда я вызываю метод Run, он выполняет метод из реального типа (хотя я и объявил его базовым классом).
Моя проблема в том, что мне нужно показать пользовательский интерфейс для каждого из этих производных классов. Я думал создать пользовательский UserControl для каждого из них. У этих элементов управления будет метод puclic, который возвращает мне значение, основанное на том, что пользователь сделал на нем. Затем я создаю этот элемент управления во время выполнения, пользователь устанавливает то, что необходимо, и я вызываю метод return из этого элемента управления, и я могу, наконец, передать i методу Run Run из класса, который пользователь выбрал и выполнил.
Я не знаю, сколько или каких производных классов у меня есть, потому что пользователь может создать dll, полученный из этого базового класса, и прикрепить его как плагин.
Из-за этого, я думаю, мне пришлось бы создавать эти настраиваемые элементы управления в форме как общий класс UserControl, а затем использовать их как действительный тип. Но есть ли способ сделать это, только зная, что контроль был получен из UserControl?
Я могу создать публичное свойство в базовом классе для хранения своего настраиваемого элемента управления, но обратно в основной код можно ли использовать общий пользовательский элемент управления как тип, хранящийся в этом свойстве?
Кроме того, будет проблема с дизайном здесь? Могу ли я использовать другие подходы для этого?
Я надеюсь, что это не звучит очень запутанным :(
Есть ли существующие плагины? (т. е. вам нужно беспокоиться о обратной совместимости?) – Cameron
Это более чем возможно, и вы на правильном пути - с помощью дженериков вы можете избежать многих проблем с кастом (посмотрите на общие ограничения) и разрешите пользователю определять пользовательский интерфейс usercontrol (им нужно будет указать ascx в классе, который они создали, который использовал ваш класс Generic Base в качестве шаблона) –
Не можете ли вы просто потребовать от своих пользовательских элементов управления реализовать интерфейс? Затем вы можете заранее знать, какой метод вызывать для получения данных. – Tejs