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

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

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

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

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

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

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

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

11
1495 / 1210 / 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 / 59
Регистрация: 11.01.2016
Сообщений: 1,311
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 / 59
Регистрация: 11.01.2016
Сообщений: 1,311
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 / 59
Регистрация: 11.01.2016
Сообщений: 1,311
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.04.2016, 11:49
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru