Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1

Вызов метода интерфейса для элементов коллекции

26.12.2022, 11:51. Показов 508. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Создан интерфейс
VB.NET
1
2
3
Public Interface IBuilder
    Function Build(reader As Object) As IBuilder
End Interface
Также есть несколько типов реализующих этот интерфейс
Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public Class EntityObj
    Implements IBuilder
 
    Public Property ID As Integer
    Public Property Name As String
 
    Public Sub New()
 
    End Sub
 
    Public Function Build(reader As Object) As IBuilder Implements IBuilder.Build
        Return New EntityObj()
    End Function
 
    Public Overrides Function ToString() As String
        Return Me.Name
    End Function
End Class


Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Public Class EntityObj2
    Implements IBuilder
 
    Public Property Name2 As String
 
    Public Sub New()
 
    End Sub
 
    Public Function Build(reader As Object) As IBuilder Implements IBuilder.Build
        Return New EntityObj2()
    End Function
 
    Public Overrides Function ToString() As String
        Return Me.Name2
    End Function
End Class

Мне необходимо в классе коллекции вызывать метод интерфейса, однако конкретный тип элементов заведомо не известен.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Public Class EntityColl(Of IBuilder)
    Implements IList
 
    Private _Items As List(Of IBuilder)
 
    Public Sub New()
        _Items = New List(Of IBuilder)
    End Sub
 
    Private Function GetElementType(enumerable As IEnumerable) As Type
        Return enumerable.GetType().GetInterface("IEnumerable`1").GetGenericArguments()(0)
    End Function
 
    Public Sub Load(reader As IEnumerable)
        Dim t As Type = GetElementType(_Items)
        If t <> GetType(IBuilder) Then
            Throw New Exception("Тип элементов коллекции не реализует IBuilder интерфейс")
        End If
 
        If t IsNot Nothing Then
            Dim instance As Object = DirectCast(Activator.CreateInstance(t), IBuilder) '← Это срабатывает, но возвращается Object
            Dim newObj As IBuilder
            newObj = instance.Build(Item) '← тут необходимо вызвать метод интерфейса, но для конкретного типа
        End If
 
    End Sub
 
    '... далее реализация IList
End Class
Как такое сделать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.12.2022, 11:51
Ответы с готовыми решениями:

Вызов метода являющегося элементом коллекции
Есть коллекция методов List&lt;object&gt; objects = new List&lt;object&gt;(); objects.Add(new Action(() =&gt; SendKeys.Send(&quot;{TAB}&quot;))); Пытаемся...

Вызов метода из события изменения коллекции
Здравствуйте всем. Подскажите пожалуйста, как правильно из события CollectionChanged класса ObservableCollection вызвать функцию из...

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
В базовом классе метод помечен как virtual. Насколько я понял из книги: override означает, что метод не утрачивает связи с базовым...

4
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
26.12.2022, 12:09
Должно работать:
VB.NET
1
Dim instance As IBuilder = DirectCast(Activator.CreateInstance(t), IBuilder) '← Это срабатывает, но возвращается Object
Activator.CreateInstance возвращает Object, который вы привели к типу данных IBuilder через оператор DirectCast, поэтому можно делать «Dim instance As IBuilder»
0
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
26.12.2022, 12:37  [ТС]
Замабувараев, я так пробовал, но студия говорит: "Build" не является членом "IBuilder" на строке instance.Build(Item)
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
26.12.2022, 12:54
Наверняка какой‐то конфликт имён, и когда студия говорит «"Build" не является членом "IBuilder"», она имеет ввиду какой‐нибудь System.IBuilder или что‐то в этом роде.

Два решения.
1. Укажите полное имя интерфейса с пространством имён Dim instance As ВашеПространствоИмён.IBuilder.
2. Переименуйте IBuilder во что‐то другое.
1
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
26.12.2022, 13:24  [ТС]
Сработал первый вариант.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.12.2022, 13:24
Помогаю со студенческими работами здесь

Protected для реализации метода интерфейса
Добрый день! Помогите пожалуйста Есть интерфейс с некоторыми методами и абстрактный класс, который их реализует, и у этого абстрактного...

Получение новой коллекции путем фильтрации элементов коллекции находящихся в другой коллекции
Всем привет, нуждаюсь в помощи знатоков) Имеется вот такая иерархия если представить в JSON: { teachers: ...

Вызов метода при переборе элементов массива
У меня есть массив экземпляров нескольких классов и метод для присвоения значения одному полю. Далее мне нужно получить значение этого поля...

Как задать разные параметры для одного метода интерфейса
Есть 4 события: гол, удаление, буллит и время вратаря. Все эти события реализуют один интерфейс &lt;?php namespace...

Вызов метода одного из элементов динамического массива классов
Есть метод класса: int dates::FirstClock() { ShowMessage(name+text); return 0; } Создание динамического массива классов и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru