Наследование классов и CType

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Наследование классов и CType

Сообщение drronnie » 26.12.2007 (Ср) 1:12

Господа, такая проблема...
Создаю 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 можно присвоить переменную любого типа... я что-то понимаю не так?
Компиляция - перевод словесного поноса в машинный код.

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 27.12.2007 (Чт) 9:44

Опытным путём удалось выяснить, что если базовый и наследуемый класс в одном проекте то никаких ошибок не возникает.
Компиляция - перевод словесного поноса в машинный код.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 28.12.2007 (Пт) 11:45

понятно. Скорее всего:

а) разные базовые сборки.

скомпили общую дллку и использую в проектах, не ндо её перекомпилять каждый раз

б) повторня загрузка сборки (скореевсего)

проект ссылается на сборку + потом подгружает её же динамически


Вперёд!)
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList