Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
556 / 1417 / 38
Регистрация: 08.01.2017
Сообщений: 6,993
1

Как привести (состыковать) разные типы из разных классов (исп в качестве выходного параметра в методе)

12.01.2018, 20:52. Показов 1173. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вопрос состоит в том как максимально просто заставить работать такой неправильный код. Самое простое решение использовать в качестве параметра не структуру, а массив. Или использовать структуру одного типа (из одного из классов). А как быть если хочется использовать именно две структуры из разных классов? Нужно определить собственный оператор приведения типа? Или как-то иначе можно?
Две структуры Sl и Sp из двух классов по сути определены одинаково. Но формально это разные типы.
Вот пример кода:
Кликните здесь для просмотра всего текста
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
namespace StructParamMetod
{
    public class Program
    {
        static void Main(string[] args)
        {
            Sp stp = new Sp(); ;
            cl.Met(out stp);//да, так не работает! Sp и cl.Sl Это разные типы
        }
        public struct Sp
        {
            public int b1;
            public int b2;
            public int b3;
        }   
    }
    public class cl
    {
       public struct Sl
        {
            public int a1;
            public int a2;
            public int a3;
        }
        static public void Met(out Sl st)
        {
            st.a1 = 1;
            st.a2 = 2;
            st.a3 = 3;
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2018, 20:52
Ответы с готовыми решениями:

Как сделать разные типы возвращаемых значений в одном методе
как сделать разные типы возвращаемых значений в одном методе? public static DateTime...

Разные типы в обобщенном методе
Здравствуйте. Хочу написать следующий метод: подается массив типа int или string или object и тд,...

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

Написать функцию, имеющую одну реализацию, но принимающую в качестве аргументов разные типы
Хочу написать независимый от библиотеки код. В библиотеке есть класс А, а у меня В. У них абсолютно...

7
Эксперт .NET
11077 / 6994 / 1571
Регистрация: 25.05.2015
Сообщений: 21,109
Записей в блоге: 14
12.01.2018, 21:04 2
titan4ik, а зачем дважды определять похожие структуры?
Два класса могут одну юзать структуру данных, например.
1
1519 / 478 / 126
Регистрация: 09.01.2018
Сообщений: 1,233
12.01.2018, 21:07 3
titan4ik, Мешанина у вас какая то, две структуры из двух классов. Класс это класс, структура это структура.

вот вам примерчик с вашими структурами:

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
    class Program
    {
        static void Main(string[] args)
        {
            Sl sl = new Sl() { Value = 100 };
            Sp sp = (Sp)sl;
            Console.WriteLine(sp.Value); //Out: 100
 
            Console.ReadKey();
        }
    }
 
    public struct Sp
    {
        public int Value { get; set; }
 
        public static explicit operator Sp(Sl source)
        {
            return new Sp() { Value = source.Value };
        }
    }
 
    public struct Sl
    {
        public int Value { get; set; }
    }
1
556 / 1417 / 38
Регистрация: 08.01.2017
Сообщений: 6,993
12.01.2018, 21:57  [ТС] 4
Цитата Сообщение от Rius Посмотреть сообщение
а зачем дважды определять похожие структуры?
Два класса могут одну юзать структуру данных, например.
Да, похоже, что практически незачем. Просто удивился какие трудности возникают в этом слуаче, если отойти от базовых типов. С массивами, например, никаких проблем. Массив он и в Африке массив.
Но теоретический интерес к проблеме остался)

Добавлено через 3 минуты
Цитата Сообщение от escoult Посмотреть сообщение
вот вам примерчик с вашими структурами:
Да, но в качестве параметра метода с модификатором out конструкция такого рода (Sp)sl не работает. Выдается сообщение, что "Аргумент ref или out должен быть переменной, которой можно присвоить значение."

Добавлено через 4 минуты
Цитата Сообщение от escoult Посмотреть сообщение
две структуры из двух классов. Класс это класс, структура это структура.
Представьте, что один класс определяет некий расчет. Результат расчета - out параметр метода этого класса - структура, определенная в данном классе. А вызывается этот метод в другом классе. Как в этом случае вызвать метод, если не использовать структуру из первого класса? Вот в чем был вопрос.
0
Эксперт .NET
11077 / 6994 / 1571
Регистрация: 25.05.2015
Сообщений: 21,109
Записей в блоге: 14
12.01.2018, 21:59 5
Цитата Сообщение от titan4ik Посмотреть сообщение
если не использовать структуру из первого класса?
Ну а почему бы и не использовать?
Куча классов в .Net использует только свои классы данных. EventArgs всякие, например.
1
556 / 1417 / 38
Регистрация: 08.01.2017
Сообщений: 6,993
12.01.2018, 22:14  [ТС] 6
Цитата Сообщение от Rius Посмотреть сообщение
Ну а почему бы и не использовать?
Понятно. Ок. Буду считать, что такой путь правильный. Спасибо.
Подобные вопросы возникают, поскольку c# предоставляет массу разных вариантов. А как выбрать совокупность тех решений, которые более-менее лежат в области разумной целесообразности? Для этого нужно обладать обширными знаниями и хорошим опытом.
Я как-то задавал вопрос по стандартной (некой рабочей) архитектуре программы для инженерного расчета. Но ответа не получил. Пока не понятно и что почитать на эту тему.
0
1519 / 478 / 126
Регистрация: 09.01.2018
Сообщений: 1,233
12.01.2018, 23:01 7
Цитата Сообщение от titan4ik Посмотреть сообщение
Да, но в качестве параметра метода с модификатором out конструкция такого рода (Sp)sl не работает. Выдается сообщение, что "Аргумент ref или out должен быть переменной, которой можно присвоить значение."
Цитата Сообщение от titan4ik Посмотреть сообщение
Представьте, что один класс определяет некий расчет. Результат расчета - out параметр метода этого класса - структура, определенная в данном классе. А вызывается этот метод в другом классе. Как в этом случае вызвать метод, если не использовать структуру из первого класса? Вот в чем был вопрос.
Да, с out это не сработает. Значит нужно сначала получить результат, а потом привести его к нужному типу. Но тут на самом деле вопрос, зачем это нужно? Разве что только в образовательных целях. Можно организовать что то вроде этого:

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
 class Program
    {
        static void Main(string[] args)
        {
            Sender sender = new Sender();
            Sender.OutData outData;
            sender.SendResult(out outData);
 
            Reciever reciever = new Reciever();
            Reciever.InData result = reciever.RecieveData(outData);
 
            Console.WriteLine(result.Data);
            Console.ReadKey();
        }
    }
 
    public class Sender
    {
        public struct OutData
        {
            public string Data { get; set; }
            public OutData(string data)
            {
                Data = data;
            }
        }
 
        public void SendResult(out OutData outData)
        {
            outData = new OutData("some data to send");
        }
    }
 
    public class Reciever
    {
        public struct InData
        {
            public string Data { get; set; }
            public InData(string data)
            {
                Data = data;
            }
        }
 
        public InData RecieveData(Sender.OutData data)
        {
            return new InData("Data send: " + data.Data + 
                " //-- recieved: " + DateTime.Now.ToShortTimeString());
        }
    }
Как видите, обе структуры доступны в третьем классе (Program) и какой то необходимости в приведении типов нет (Можно вполне обойтись без метода RecieveData). Вот если, к примеру эти классы находятся в разных слоях. Или какой то метод требует для своей работы параметры иного типа, чем возвращает первый класс и переписать этот метод нет возможности, тогда придется заморочиться с приведением между типами. (Ну а в случае со слоями - маппингом). В вашем же случае такой необходимости вообще не возникает.
1
556 / 1417 / 38
Регистрация: 08.01.2017
Сообщений: 6,993
12.01.2018, 23:24  [ТС] 8
Цитата Сообщение от escoult Посмотреть сообщение
Можно организовать что то вроде этого:
Это немножко про другое. Это убеждает ещё раз только в том, что проще всего использовать тип структуры класса "Отправителя" в лоб - напрямую в нужном классе, где вызывается метод.
Ок. Спасибо.
0
12.01.2018, 23:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2018, 23:24
Помогаю со студенческими работами здесь

Передача разных конкретных типов перечисления в один метод в качестве параметра
Поскольку прямая лобовая передача типа перечисления в метод в качестве параметра невозможна (?), то...

Написать программу для функции, которая будет получать в качестве параметра объект одного из классов
Нужно написать программу для функции, которая будет получать в качестве параметра объект одного из...

Философия. Можете привести примеры разных классов, в которых реализуется один и тот же интерфейс?
Причём классам должны соответствовать объекты или явления из как можно более далёких областей...

Как использовать в команде join в качестве выходного разделителя табуляцию?
Добрый вечер!. Есть 2 таблицы: C:\nncron>cat A.txt John A 1 Linda B 2 Rares C 3 Lubos D 4...

Передача класса как параметра в методе
Добрый вечер. У меня проблема. foreach (Form item in Application.OpenForms) { ...

Как привести типы в соответствие функции?
всем добрый день, прошу помощи с таким вопросом, как привести в соответствие входные данные, при...


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

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