На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 343 344 [345] 346 347 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата MyNameIsIgor @
    А что бы случилось, если бы они посчитали это нужным? :)

    Вы смогли бы написать
    ExpandedWrap disabled
      foreach(var w in words)
        words_count[w]++;

    только вместо int пришлось бы юзать какой-нибудь int-box
      korvin, т.е. вы либо думать не хотите, либо просто дурачка включили.
      В таком случае класс словаря был бы описан как-то так
      ExpandedWrap disabled
        class Dictionary<TKey, TValue> where TValue : new()

      Естественно, это слишком жёсткое ограничение. Так что fail.
        Цитата MyNameIsIgor @
        korvin, т.е. вы либо думать не хотите, либо просто дурачка включили.
        В таком случае класс словаря был бы описан как-то так
        ExpandedWrap disabled
          class Dictionary<TKey, TValue> where TValue : new()

        Естественно, это слишком жёсткое ограничение. Так что fail.

        чего? какое еще ограничение?
          Цитата korvin @
          чего? какое еще ограничение?

          Ну, а как вы собрались создавать пару, не гарантировав компилятору, что у TValue есть конструктор по умолчанию?
            Вы можете нормально объяснить, в чем у Вас проблема?
              Цитата korvin @
              Вы можете нормально объяснить, в чем у Вас проблема?

              :huh: Напишите работающий дженерик вида
              ExpandedWrap disabled
                template<class T>
                class A
                {
                public:
                  T foo() { return T(); }
                };

              И да, я объясняю нормально. Не желающие понимать могут проваливать - я никого не держу.
                Цитата MyNameIsIgor @
                Естественно, это слишком жёсткое ограничение. Так что fail.

                Но если нужно - можно сделать соответствующий, специализированный словарь, с таким вот ограничением. У вас ведь ++ тоже не для всех специализаций работает.
                  Цитата IL_Agent @
                  Но если нужно - можно сделать соответствующий, специализированный словарь, с таким вот ограничением.

                  Что неудобно.
                  Цитата IL_Agent @
                  У вас ведь ++ тоже не для всех специализаций работает.

                  А здесь нет никаких специализаций.
                    Цитата MyNameIsIgor @
                    Ну, а как вы собрались создавать пару, не гарантировав компилятору, что у TValue есть конструктор по умолчанию?

                    пусть этим занимается хеш
                    ExpandedWrap disabled
                      abstract class MyHashMap<K, V> extends HashMap<K, V> {
                          abstract protected V makeDefault();
                          public V get(K key) {
                              if(containsKey(key)) {
                                  return super.get(key);
                              } else {
                                  V value = makeDefault();
                                  put(key, value);
                                  return value;
                              }
                          }
                      }
                       
                      public class MyHashMapTest {
                         public static void main(String[] args) {
                             Map<String, Integer> map = new MyHashMap<>() {
                                 protected Integer makeDefault() { return 0; }
                             };
                         }
                      }


                    Добавлено
                    можно даже так:
                    ExpandedWrap disabled
                      interface Factory<A> {
                          A make();
                      }
                       
                      class IntegerFactory implements Factory<Integer> {
                          public Integer make() { return 0; }
                      }
                       
                      class MyHashMap<K, V, F extends Factory<V>> extends HashMap<K, V> {
                          private final F factory;
                          public MyHashMap(F factory) { this.factory = factory; }
                          public V get(K key) {
                              if(containsKey(key)) {
                                  return super.get(key);
                              } else {
                                  V value = factory.make();
                                  put(key, value);
                                  return value;
                              }
                          }
                      }
                       
                      public class MyHashMapTest {
                         public static void main(String[] args) {
                             Map<String, Integer> map = new MyHashMap<>(new IntegerFactory());
                         }
                      }


                    Добавлено
                    Цитата MyNameIsIgor @
                    :huh: Напишите работающий дженерик вида
                    ExpandedWrap disabled
                      template<class T>
                      class A
                      {
                      public:
                        T foo() { return T(); }
                      };

                    И да, я объясняю нормально. Не желающие понимать могут проваливать - я никого не держу.

                    гарантия наличия конструкторов по-умолчанию не имеет отношения к дженерикам/шаблонам. если б джава давала такие гарантии, то и проблемы с написанием такого дженерика не было б вообще никаких.
                    Сообщение отредактировано: korvin -
                      Цитата korvin @
                      пусть этим занимается хеш

                      И где реализация метода abstract protected V makeDefault() ?
                      Цитата korvin @
                      гарантия наличия конструкторов по-умолчанию не имеет отношения к дженерикам/шаблонам.

                      Имеет. Дженериком нужна такая гарантия. Шаблонам она не нужна пока мы об этом не попросим.
                      Цитата korvin @
                      если б джава давала такие гарантии, то и проблемы с написанием такого дженерика не было б вообще никаких.

                      Шарп может дать. Но подобный словарь был бы ущербным.

                      Добавлено
                      Цитата korvin @
                      можно даже так:

                      Матерь Божья, как же много слов...
                        Цитата MyNameIsIgor @
                        И где реализация метода abstract protected V makeDefault()?

                        ExpandedWrap disabled
                          Map<String, Integer> map = new MyHashMap<>() {
                              protected Integer makeDefault() { return 0; } // <- вот же
                          };
                          Как это мило, задавать для каждого словаря фабрику или метод создания Value :rolleyes:
                            Цитата MyNameIsIgor @
                            Имеет. Дженериком нужна такая гарантия. Шаблонам она не нужна пока мы об этом не попросим.

                            чего бы это вдруг она им нужна? и как обычно в C++ придется писать обертку, если у нужного нам класса нет конструктора по-умолчанию
                              Цитата korvin @
                              чего бы это вдруг она им нужна?

                              Потому что они компилируются сразу в код, а не инстанцируются для аргументов.
                              Цитата korvin @
                              и как обычно в C++ придется писать обертку, если у нужного нам класса нет конструктора по-умолчанию

                              Только если мы захотим использовать индексацию. Если не захотим, то не используем - и всё работает.
                                Цитата MyNameIsIgor @
                                Как это мило, задавать для каждого словаря фабрику или метод создания Value :rolleyes:

                                зачем для каждого? если вам не на один раз, опишите класс
                                ExpandedWrap disabled
                                  class MyIntegerHashMap<K> extends MyHashMap<K, Integer> {
                                      protected Integer makeDefault() { return 0; }
                                  }

                                опять надуманные проблемы?

                                Добавлено
                                Цитата MyNameIsIgor @
                                Шарп может дать. Но подобный словарь был бы ущербным.

                                почему же ущербным?

                                Цитата MyNameIsIgor @
                                Матерь Божья, как же много слов...

                                это делается один раз и навсегда, как я уже говорил, это могло бы быть вшито в стандартный HashMap, но авторы видимо посчитали это излишеством.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 343 344 [345] 346 347 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.4700 ]   [ 14 queries used ]   [ Generated: 31.07.26, 08:54 GMT ]