Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
9 / 9 / 5
Регистрация: 07.11.2014
Сообщений: 112
1

Интерфейс объекта

02.04.2016, 15:28. Показов 1873. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Как можно определить интерфейс объекта? type.GetInterface() не помогает. Проблема в том что есть несколько интерфейсов: IResult, IResultMedia, IResultText, IResultLocation. Интерфейс IResult является предком остальных интерфейсов. И есть классы который реализует эти интерфейсы. Как можно определить какой класс какой конкретный интерфейс реализует?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.04.2016, 15:28
Ответы с готовыми решениями:

Можно ли создать интерфейс, в котором один из методов будет возвращать класс, который реализует интерфейс
Можно ли создать интерфейс, в котором один из методов будет возвращать класс, который реализует...

Как создавать источник данных в виде объекта и связывать столбцы со свойствами объекта
Пытаюсь сделать DataGridView с данными из List'a. В дизайнере формы в опциях DataGridView задал...

Вычислить периметр объекта-окружности и объекта-многоугольника
Создать два объекта класса, вписанных в окружность радиуса R. Вычислить периметр объекта-окружности...

Как использовать интерфейс объекта?
Привет форумчане! В общем, изучаю плюсы и столкнулся с такой проблемой для себя, что не могу...

11
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,628
02.04.2016, 15:33 2
How to determine if a type implements an interface with C# reflection
http://stackoverflow.com/quest... reflection
0
9 / 9 / 5
Регистрация: 07.11.2014
Сообщений: 112
02.04.2016, 19:47  [ТС] 3
afront, Нет это не подходит так как я заранее не знаю какой объект(класс) будет но точно знаю что этот объект реализует один из вышеперечисленных интерфейсов. Вообщем задачка такая: Есть несколько подключаемые библиотеки и они возвращают ответ в виде объекта который реализует следующие интерфейсы: IResultMedia, IResultLocation, IResultText и эти интерфейсы наследует IResult. Ответ который возвращает подключаемые библиотеки может быть IResult, IResultMedia, IResultText или еще какой нибудь объект реализующий интерфейс наследуемый от IResult. И в зависимости от типа этих возвращаемых объектов надо их обработать по разному.
0
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
02.04.2016, 21:47 4
Проверять через as/is?
0
162 / 150 / 60
Регистрация: 11.01.2016
Сообщений: 1,312
02.04.2016, 22:07 5
Muhammadjon,
можно так
C#
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System;
 
namespace Interfaces
{
    interface IResult
    {
    }
 
    interface IResultMedia : IResult
    {
    }
    interface IResultText : IResult
    {
    }
    interface IResultLocation : IResult
    {
    }
 
 
    class MyClass1 : IResultMedia
    {
    }
    class MyClass2 : IResultText
    {
    }
 
    class Program
    {
        static void Main()
        {
            MyClass1 instanceMyClass1 = new MyClass1();
            MyClass2 instanceMyClass2 = new MyClass2();
 
            IResultMedia instance1 = instanceMyClass1 as IResultMedia;
 
            if (instance1 == null)
            {
                Console.WriteLine("MyClass1  не реализует интерфейс IResultMedia");
            }
            else
            {
                Console.WriteLine("MyClass1 класс реализует интерфейс IResultMedia");
            }
 
            IResultText instance2 = instanceMyClass2 as IResultText;
 
            if (instance1 == null)
            {
                Console.WriteLine("MyClass2 не реализует интерфейс IResultText");
            }
            else
            {
                Console.WriteLine("MyClass2 реализует интерфейс IResultText");
            }
        }
    }
}
0
9 / 9 / 5
Регистрация: 07.11.2014
Сообщений: 112
04.04.2016, 11:28  [ТС] 6
Цитата Сообщение от Lexeq Посмотреть сообщение
Проверять через as/is?
Цитата Сообщение от UseMuse Посмотреть сообщение
можно так
1. Это дает правильный результат (true) в любом случае если интерфейс объекта является наследником IResult.
2. Думаю будет не правильным решением так как придется каждый раз добавить if если добавляется еще один интерфейс.
0
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
04.04.2016, 15:46 7
Цитата Сообщение от Muhammadjon Посмотреть сообщение
1. Это дает правильный результат (true) в любом случае
Неправда
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    interface IResult { }
    interface IResultText : IResult { }
    interface IResultMedia : IResult { }
 
    class SomeClass : IResultMedia { }
 
    class Program
    {
        static void Main(string[] args)
        {
            SomeClass sc = new SomeClass();
            Console.WriteLine(sc is IResultMedia); //TRUE
            Console.WriteLine(sc is IResultText);  //FALSE
            Console.ReadKey();
        }
    }
Цитата Сообщение от Muhammadjon Посмотреть сообщение
придется каждый раз добавить if если добавляется еще один интерфейс.
Если у вас для каждого интерфейса своя логика работы, то в любом случае придется как-то выбирать какую логику применять.

Вообще, наверно, вам стоит пересмотреть архитектуру. Если метод принимает IResult, то ему не должно быть дела до того IResultText это или IResultMedia. Ему должно быть достаточно методов из IResult, остальное - проблема класса, реализующего его, иначе какой смысл в интерфейсе?
1
9 / 9 / 5
Регистрация: 07.11.2014
Сообщений: 112
04.04.2016, 17:56  [ТС] 8
Цитата Сообщение от Lexeq Посмотреть сообщение
Вообще, наверно, вам стоит пересмотреть архитектуру.
Я тоже думаю об этом. Возможно я не совсем правильно использовал интерфейсы. Вот опишу что хотел сделать. Есть программа который отправлять сообщения пользователям в зависимости от содержания сообщения. А сообщение обрабатывает подключаемые модули(библиотека,dll). Каждый модуль может только создать ответ и ответ может быть в текстовом, аудио, видео или еще на каком нибудь формате. Все основные методы который должен присутствовать в любом ответе отмечено в интерфейсе IResult. И соответственно для текстового ответа свой интерфейс(IResultText) наследуемый от IResult и для других тоже так. Также есть модуль Sender который отправляет полученный ответ этих подключаемых модулей. Внутри этого модуля реализованы несколько функций для отправки текста, видео, аудио и т.д. Теперь проблема в том что как определить типа ответа и передать в нужную функцию.

Добавлено через 12 минут
Цитата Сообщение от Lexeq Посмотреть сообщение
Неправда
При проверке на IResult

C#
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
30
31
32
33
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace MyProject
{
    interface IResult { }
    interface IResultMedia : IResult { }
    interface IResultText : IResult { }
 
    class firstClass : IResultMedia { }
 
    class secondClass : IResultText { }
 
    class lastClass : IResult { }
 
    class Program
    {
        static void Main(string[] args)
        {
            firstClass c1 = new firstClass();
            secondClass c2 = new secondClass();
            lastClass c3 = new lastClass();
 
            Console.WriteLine(c1 is IResult);
            Console.WriteLine(c2 is IResult);
            Console.WriteLine(c3 is IResult);
            Console.ReadLine();
        }
    }
}
0
162 / 150 / 60
Регистрация: 11.01.2016
Сообщений: 1,312
05.04.2016, 10:22 9
Muhammadjon,
Цитата Сообщение от Muhammadjon Посмотреть сообщение
При проверке на IResult
Есесено будет везде true

а так нет
C#
1
2
3
4
            
Console.WriteLine(c1 is IResultMedia);//true
            Console.WriteLine(c2 is IResultMedia);//false
            Console.WriteLine(c3 is IResultMedia);)//false
проверяй на конкретный интерфейс
1
9 / 9 / 5
Регистрация: 07.11.2014
Сообщений: 112
05.04.2016, 10:40  [ТС] 10
Цитата Сообщение от UseMuse Посмотреть сообщение
проверяй на конкретный интерфейс
Кажется дошло )))). Можно же не проверять на IResult ))) т.е. объект который реализовал непосредственно интерфейс IResult не может быть ответом. В IResult будет только адрес отправителя и некоторые обязательные параметры. А то что надо отправить отмечается в других интерфейсах наследованного от IResult. Модули может возвращать объекты реализующий интерфейс IResult. А это нормально? т.е. не будет велосипедом?

Добавлено через 7 минут
А можно ли обойтись без If ? А то получается много ifов
0
162 / 150 / 60
Регистрация: 11.01.2016
Сообщений: 1,312
05.04.2016, 11:10 11
Muhammadjon, if many "if", used "switch"
0
9 / 9 / 5
Регистрация: 07.11.2014
Сообщений: 112
05.04.2016, 11:49  [ТС] 12
Изменил архитектуру. Полностью удалил все эти интерфейсы кроме IResult. Кажется слишком фантазировал. Потому что в дальнейшем вряд ли будет что то еще нового типа. Создал несколько абстрактных классов который реализует этот интерфейс. Модуль который обработает эти ответы "понимает" только этот интерфейс и абстрактные классы. Только вот с этими if что то не могу найти решение. Ну со switch ясно но как обработать в этом switche. В голову приходит только это

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
                 var result = processor.Result;
                        switch(result.GetType().Name)
                        {
                            case "AudioReply" :
                                var audioReply = (AudioReply)result;
                                await this.bot.SendAudio(audioReply.ChatId, audioReply.Resource, audioReply.Duration, audioReply.Performer, audioReply.Title);
                                break;
                            case "VideoReply":
                                var videoReply = (VideoReply)result;
                                await this.bot.SendVideo(videoReply.ChatId, videoReply.Resource, videoReply.Duration, videoReply.Caption, videoReply.ReplyToMessageId);
                                break;
                            
                        }
0
05.04.2016, 11:49
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.04.2016, 11:49
Помогаю со студенческими работами здесь

Wrapper реализовать интерфейс оборачиваемого объекта
Как бы создать инструмент, чтобы он создавал экземпляры обёртки, которая реализует указанный...

Iptables, правила, перенаправляющие на интерфейс eth1 все пакеты, приходящие на интерфейс eth0
Добрый день, подскажите, пожалуйста, как Iptables написать правила, перенаправляющие на интерфейс...

База данных "учебный план специальности". GUI. Графический интерфейс. Пользовательский интерфейс
Всем привет. Свалилась на меня, значит, курсовая по прологу. Все бы ничего, да реализовать ее надо...

Узнать имя компонента, реализующего интерфейс и имя категории, в которую этот интерфейс входит
Темы очень близки. Поэтому два в одном решил сделать. Вот я взял у Роджерсона код: HRESULT...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Интеграция Arduino и ChatGPT: Практическое руководство
InfoMaster 16.01.2025
В современную эпоху технологических инноваций интеграция искусственного интеллекта с микроконтроллерами открывает принципиально новые возможности для создания умных устройств и автоматизированных. . .
Как создать робота, управляемого ChatGPT
InfoMaster 16.01.2025
Концепция проекта В современную эпоху искусственный интеллект и робототехника становятся все более доступными для энтузиастов и разработчиков. Создание роботизированной руки, управляемой ChatGPT,. . .
Как создать ChatGPT бота в Telegram на Python
InfoMaster 16.01.2025
В современном мире технологии искусственного интеллекта становятся все более доступными для разработчиков, открывая новые возможности для создания умных и интерактивных приложений. Одним из самых. . .
Машинное обучение с помощью Python
InfoMaster 16.01.2025
Машинное обучение стало неотъемлемой частью современных технологий, позволяя компьютерам учиться на основе данных и принимать решения без явного программирования. В сочетании с языком. . .
Использование связки C# и PHP в корпоративной разработке и микросервисной архитектуре
InfoMaster 16.01.2025
Введение в интеграцию C# и PHP В современной корпоративной разработке все чаще возникает потребность в создании гибких и масштабируемых решений, способных эффективно решать широкий спектр. . .
Как использовать Kerio дома для управления сетью и пользователями
InfoMaster 16.01.2025
Использование технологий для улучшения повседневной жизни стало неотъемлемой частью современного быта. Одной из таких технологий является Kerio — мощный инструмент для управления сетью и. . .
Есть ли будущее у DVD и Blu-ray?
InfoMaster 16.01.2025
В эпоху стремительного развития цифровых технологий и повсеместного распространения потоковых сервисов вопрос о будущем физических носителей информации становится все более актуальным. Особенно остро. . .
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru