Создаю ClassLibrary PluginBase, а в нём класс Plugin, который объявлен как MustInherit. Далее создаю другую ClassLibrary PluginKeyboard, в которой тоже есть класс Plugin, который унаследован от PluginBase.Plugin.
И есть WindowsApplication (Option Strict On), в котором создается экземпляр класса PluginKeyboard.Plugin таким образом:
- Код: Выделить всё
Dim plgModule As PluginBase.Plugin
plgModule = mvarAssembly.CreateInstance(mvarAssembly.GetExportedTypes(i).FullName)
MsgBox(plgModule.Name)
Возникает Design-Time ошибка в строке 2: Option Strict On disallows implicit conversions from 'Object' to 'PluginBase.Plugin'.
Если plgModule объявить как Object, то возникает Design-Time ошибка в строке 3: Option Strict On disallows late binding.
В первом случае предлагается заменить вторую строку на
- Код: Выделить всё
plgModule = CType(mvarAssembly.CreateInstance(mvarAssembly.GetExportedTypes(i).FullName), PluginBase.Plugin)
Если заменить, то всё компилится, но в этой строке возникает Run-Time ошибка: Unable to cast object of type 'PluginKeyboard.Plugin' to type 'PluginBase.Plugin'.
Пробовал переопределить функцию CType для класса PluginKeyboard.Plugin но обругалось на то, что нельзя конвертировать в базовый тип.
Пробовал написать PluginBase.Plugin не как класс, а как интерфейс и соответственно наследовать интерфейс, но тоже с присвоениями такая-же проблема... да и наследовать интерфейс не совсем подходит, т.к. мне нужен код, который будет написан именно в PluginBase.Plugin, а не переписан в каждом дочернем классе.
Я как-то извращённо понимаю наследование??? Но по-моему в C++ можно присвоить указателю на базовый класс адрес объекта наследуемого.
Что делать? При этом если выключить Option Strict и объявить plgModule как Object - всё работает. Просьба не судить строго, т.к. с VB.NET сталкиваюсь впервые

P.S. Т.е. если любой тип наследуется от Object, то переменной типа Object можно присвоить переменную любого типа... я что-то понимаю не так?