Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Rameron
Си-решеточник
138 / 132 / 60
Регистрация: 07.02.2011
Сообщений: 662
1

Определение возвращаемой переменной при создании класса

03.03.2014, 13:20. Просмотров 1006. Ответов 10
Метки нет (Все метки)

Всем здравствуйте и большой привет с Украины

Прошу помощи с таким вопросом:
Имеется класс, в котором при создании через конструктор, задается тип переменной, для получения которой класс, собственно, и создается.
Так вот - как в классе объявить метод, который возвращает эту переменную в заданном помощью конструктора типе?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2014, 13:20
Ответы с готовыми решениями:

Что происходит при создании переменной?
Что происходит при создании какой либо переменной? int x; Выделяется память (даже если переменная...

Ошибка при создании переменной делегатного типа
class test_delegat { static int summa_a_b(int a, int b) { return a + b; }...

Наследование от класса, передаваемого при создании объекта
Как сделать что то типа этого? public class cl<T> : T {}

Проблема при создании отдельного класса с делегатом
Здравствуйте! Суть ошибки в том, что во второй форме Data не определена. Что делать: //Program.cs...

Подсказки при создании экземпляра собственного класса
Все мы сталкиваемся с тем что при создании экземпляров классов и обращении к методам .NET сборок...

10
nio
5990 / 3397 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
03.03.2014, 13:24 2
Rameron, покажи свой класс.
0
Rameron
Си-решеточник
138 / 132 / 60
Регистрация: 07.02.2011
Сообщений: 662
03.03.2014, 13:32  [ТС] 3
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
class Sensor
    {
        String Caption;
        String RequestURL;
        Type DataType;
 
        public Sensor(String Caption, String RequestURL, Type DataType)
        {
            this.Caption = Caption;
            this.RequestURL = RequestURL;
            this.DataType = DataType;
        }
 
        public object GetData()
        {
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(RequestURL);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            object o = GetFromStream(response.GetResponseStream());
            response.Close();
 
            return o;
        }
 
        private String GetFromStream(Stream stream)
        {
            StreamReader reader = new StreamReader(stream);
            String data = reader.ReadLine();
            reader.Close();
 
            return data;
        }
    }
DataType - нужный тип возвращаемой переменной
GetData() - метод, который должен возвратить значение типа DataType. Пока что сделал типом object.
0
nio
5990 / 3397 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
03.03.2014, 13:51 4
Лучший ответ Сообщение было отмечено Rameron как решение

Решение

Rameron, тебе нужно это http://msdn.microsoft.com/ru-ru/library/sz6zd40f.aspx

Цитата Сообщение от Rameron Посмотреть сообщение
GetData() - метод, который должен возвратить значение типа DataType. Пока что сделал типом object.
в этом нет смысла, птоому что метод GetFromStream возвращает string
1
03.03.2014, 13:51
Rameron
Си-решеточник
138 / 132 / 60
Регистрация: 07.02.2011
Сообщений: 662
03.03.2014, 13:55  [ТС] 5
Цитата Сообщение от nio Посмотреть сообщение
в этом нет смысла, птоому что метод GetFromStream возвращает string
Но в строковом представлении может быть или большое число (тип long), или число поменьше (тип int), или состояние (тип bool), ли же, собственно, строка (тип String).
0
nio
5990 / 3397 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
03.03.2014, 16:03 6
Цитата Сообщение от Rameron Посмотреть сообщение
Но в строковом представлении может быть или большое число (тип long), или число поменьше (тип int), или состояние (тип bool), ли же, собственно, строка (тип String).
Нет, это неверный подход. Строка это "конечный тип", из неё нельзя получить знание того, какой тип данных в неё поместили.
0
Rameron
Си-решеточник
138 / 132 / 60
Регистрация: 07.02.2011
Сообщений: 662
03.03.2014, 16:22  [ТС] 7
Цитата Сообщение от nio Посмотреть сообщение
нельзя получить знание того, какой тип данных в неё поместили.
А что ты предлагаешь? Имея данные в виде потока, нельзя точно узнать их тип программно. Но я знаю, в каком типе эти данные представлены и эту информацию я хочу предоставить методу, чтобы он мне вернул требуемое значение.
А поток в данном случае - это набор букв/цифр, которые возвращает конкретный сенсор и которые являются результатом измерения температуры, влажности, освещенности, состояния датчика движения, уровень заряда батарей и так далее. В одних случаях это значение от 0 до 100, в других - 0 или 1, в третьих вообще время детекции движения, так что приходится конвертировать "нечто" сначала в строку (можно было и в object - не столь важно), а потом строку приводить к нужному типу и формату.
0
nio
5990 / 3397 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
03.03.2014, 16:29 8
Rameron, для твоего класса Sensor в принципе нет необходимости знать, какой тип от него хотят получить. Он должен возвращать в место запроса то, что ему вернул метод GetFromStream(), а именно строку. Переменная Type DataType избыточна для данного класса. Разбор на типы должен происходить за пределами этого класса
0
Rameron
Си-решеточник
138 / 132 / 60
Регистрация: 07.02.2011
Сообщений: 662
03.03.2014, 16:42  [ТС] 9
Цитата Сообщение от nio Посмотреть сообщение
Разбор на типы должен происходить за пределами этого класса
В этом тоже есть логика... Это также, как, например, когда я покупаю уже нарезанный хлеб, а ты покупаешь целый. В итоге мой хлеб уже находится в готовой форме для создания бутербродов, а твой надо еще надо нарезать. В итоге, если мы покупаем этот продукт для поездки на природу, тебе надо еще брать и нож с доской для нарезания.
Я всегда точно знаю тип того значение, которое вернет сенсор. То есть мне нет смысла покупать целый хлеб. А если всё таки выводить разбор на типы вне пределы класса, то это как раз и будет избыточный код (не всегда удобно тащить с собой нож с доской для нарезания).
0
nio
5990 / 3397 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
03.03.2014, 16:52 10
Rameron, ну дело твоё, тогда нужен универсальный класс, как я показал в посте 4. И дополнительно нужно реализовать внутренний конвертер типов.
Возможно следует реализовать интерфейс IConvertible или его аналог, тогда универсальный класс не нужен
0
Rameron
Си-решеточник
138 / 132 / 60
Регистрация: 07.02.2011
Сообщений: 662
03.03.2014, 16:58  [ТС] 11
Реализовал в итоге так:
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
class Sensor
    {
        public String Caption;
        public String RequestURL;
 
        public Sensor(String Caption, String RequestURL)
        {
            this.Caption = Caption;
            this.RequestURL = RequestURL;
        }
 
        public T GetData<T>()
        {
            Type resultType = typeof(T);
 
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(RequestURL);
            HttpWebResponse response;
            try
            {
                response = (HttpWebResponse)request.GetResponse();
            }
            catch (Exception exp)
            {
                throw exp;
            }
            String result = GetFromStream(response.GetResponseStream());
            response.Close();
 
            if (resultType == typeof(DateTime))
            {
                DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
                DateTime Time = Epoch.AddSeconds(Convert.ToInt64(result));
                Time = Time.AddHours(2);
                result = Time.ToString();
            }
            else if (resultType == typeof(Boolean))
            {
                result = result.Replace("0", "false");
                result = result.Replace("1", "true");
            }
            return (T)Convert.ChangeType(result, resultType);
        }
 
        private String GetFromStream(Stream stream)
        {
            StreamReader reader = new StreamReader(stream);
            String data = reader.ReadLine();
            reader.Close();
 
            return data;
        }
    }
0
03.03.2014, 16:58
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2014, 16:58

Ошибка при создании класса с несколькими констукторами
Имеются 2 класса (точка и четырехугольник), в каждом по 2 конструктора, принимающие значение...

Переполнение стека при создании экземпляра класса
Здравствуйте. Изучаю C#, решил попробовать создать дерево классов. Базовый абстрактный класс -...

При создании объекта класса обнуляется массив
При создании объекта одного класса в другому, в первом классе массив обнуляется, все значения,...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.