Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 21.06.2019, 12:56   #1
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Адрес: Москва, Зеленоград
Сообщений: 180
Репутация: 59
По умолчанию Обобщение. Инициализация экземпляра наследуемого класса

Уважаемые форумчане, подскажите пожалуйста, как решить такой вопрос:
Есть абстрактный обобщенный класс A<T>. У него есть наследники, скажем B<double>, C<double> и D<Complex>. Из tsv файла я выгружаю значения в словарь. Так вот, есть ли способ адекватно проинициализировать эти значения для разных наследуемых классов? Мне в голову пришла только такая мысль:
Код:
abstract class A<T>
{
   protected T value;
   protected A() {}
   protected A(T val)
   {
      value = val;
   }
   public abstract void SetValue(string src);
}
class B<double>
{
   public B(double val) : base (val) {}
   public override void SetValue(string src)
   {
      value = Convert.ToDouble(src);
   }
}
class C<double>
...
class D<Complex>
{
   public D(Complex val) : base (val) {}
   public override void SetValue(string src)
   {
      string[] temp = src.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
      value.Re = Convert.ToDouble(temp[0]);
      value.Im = Convert.ToDouble(temp[1]);
   }
}

static class Program
{
   static void Main()
   {
      Dictionary<B,C> dic = GetValues<C>();
      Dictionary<B,D> dic = GetValues<D>();
   }
   
   static Dictionary<B,T> GetValues<T>()
   {
      Dictionary<B,T> res = new Dictionary<B,T>();
      string[] strs = File.ReadAllLines("test.txt");
      foreach (string str in strs)
      {
         string[] temp = str.Split(new char[] {'\t'}, StringSplitOptions.RemoveEmptyEntries);
         B b = new B(temp[0]);
         T t = new T();
         T.SetValue(temp[1]);
         res.Add(b,t);
      }
      return res;
   }
}
В данном подходе не нравится, что надо создавать объект с нужным значением в 2 подхода (создание объекта с помощью стандартного конструктора и устанавливать значение с помощью SetValue()). Возможен ли иной вариант решения данного вопроса?
Заранее спасибо

Последний раз редактировалось max_prorok; 21.06.2019 в 13:15.
max_prorok вне форума   Ответить с цитированием
Старый 21.06.2019, 14:17   #2
WorldMaster
Профессионал
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Адрес: Россия, Мурманск
Сообщений: 2,158
Репутация: 607

icq: 359393755
По умолчанию

А сделать конструктор который принимает string не судьба?
__________________
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
Если помог - нажми на весы
WorldMaster вне форума   Ответить с цитированием
Старый 21.06.2019, 15:01   #3
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Адрес: Москва, Зеленоград
Сообщений: 180
Репутация: 59
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
А сделать конструктор который принимает string не судьба?
А он будет работать?
Мне вот например стидия выдает ошибку: 'T": при создании экземпляра типа переменной не удается задать аргументы на строке
Код:
T t = new T(temp[1]);
Что в принципе и логично, сделать абстрактный конструктор нельзя, и в ограничениях на Т можно поставить только наличие стандартного конструктора. Откуда знать, есть ли у класса, который подставляется под Т наличие конструктора со стрингом на входе?
Если я неправильно понял вашу мысль, не могли бы привести пример такой реализации?

Последний раз редактировалось max_prorok; 21.06.2019 в 15:03.
max_prorok вне форума   Ответить с цитированием
Старый 21.06.2019, 15:07   #4
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 14,491
Репутация: 2631
По умолчанию

Код:
using System;

abstract class A<T>
{
   protected T value;
   protected A() {}
   protected A(T val)
   {
      value = val;
   }
}
class B : A<double>
{
   public B(double val, string src) : base (val) {
      value = Convert.ToDouble(src);
   }
}

public class Test
{
	public static void Main()
	{
		B a = new B(12.4, "10");
	}
}
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 21.06.2019, 15:17   #5
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Адрес: Москва, Зеленоград
Сообщений: 180
Репутация: 59
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
B a = new B(12.4, "10");
В вашем примере Вы явно указываете тип переменной, а в моем случае - тип обобщенный.
max_prorok вне форума   Ответить с цитированием
Старый 21.06.2019, 15:38   #6
WorldMaster
Профессионал
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Адрес: Россия, Мурманск
Сообщений: 2,158
Репутация: 607

icq: 359393755
По умолчанию

Код:
class B: A<double>
    {
        public B(double val) : base(val) { }
        public B(string val) : base()
        {
            SetValue(val);
        }
        public override void SetValue(string src)
        {
            value = Convert.ToDouble(src);
        }
    }
Так то что мешает сделать?
__________________
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
Если помог - нажми на весы
WorldMaster вне форума   Ответить с цитированием
Старый 21.06.2019, 15:44   #7
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Адрес: Москва, Зеленоград
Сообщений: 180
Репутация: 59
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Так то что мешает сделать?
Не могу я вызвать конструктор B(string val) для обобщенного типа Т в методе GetValues() с помощью
Код:
T t = new T(temp[1]);
max_prorok вне форума   Ответить с цитированием
Старый 21.06.2019, 15:46   #8
WorldMaster
Профессионал
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Адрес: Россия, Мурманск
Сообщений: 2,158
Репутация: 607

icq: 359393755
По умолчанию

Цитата:
Сообщение от max_prorok Посмотреть сообщение
Не могу я вызвать конструктор B(string val) для обобщенного типа Т в методе GetValues() с помощью
Код:
T t = new T(temp[1]);
Так при чем тут обобщенный тип? У вас все классы имеют разный тип. И преобразование из строки тоже.
Значит пропишите в абстрактном классе метод преобразования типов.
__________________
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
Если помог - нажми на весы
WorldMaster вне форума   Ответить с цитированием
Старый 21.06.2019, 15:53   #9
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 14,491
Репутация: 2631
По умолчанию

Цитата:
Сообщение от max_prorok Посмотреть сообщение
для обобщенного типа Т
С каких T стал обобщенным? Вы по-моему вообще не понимаете ни наследование, ни обобщеность.
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 21.06.2019, 16:26   #10
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Адрес: Москва, Зеленоград
Сообщений: 180
Репутация: 59
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
С каких T стал обобщенным? Вы по-моему вообще не понимаете ни наследование, ни обобщеность.
Прошу прощения, неверно изложил мысль. Имелось в виду, что в обобщенном методе GetValues<T>() я не могу вызвать никакой другой конструктор для типа Т кроме как стандартный.
max_prorok вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание экземпляра подходящего класса GrandmaSquid3 Общие вопросы C/C++ 0 08.12.2018 19:23
Вызов конструктора производного класса для экземпляра базового класса max_prorok Помощь студентам 5 09.09.2015 10:39
Создание экземпляра класса biohazard120 Общие вопросы Delphi 11 15.09.2012 13:23
Освобождение памяти от экземпляра класса Mixim Общие вопросы .NET 8 05.01.2011 18:27
удаление экземпляра класса Juffin Общие вопросы Delphi 5 02.11.2010 12:57


07:19.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru