На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (245) « Первая ... 109 110 [111] 112 113 ...  244 245  ( Перейти к последнему сообщению )  
> Есть ли будущее у DELPHI?
    Цитата --Ins-- @
    Расскажи поподробнее, я не в курсе

    http://docs.oracle.com/javase/tutorial/jav.../wildcards.html


      Эээ, и как указать что папарметр дженерика - это тот же тип, что и класс, который от него унаследовался?
        Цитата D_KEY @
        Цитата --Ins-- @

        Я делаю так:
        ExpandedWrap disabled
          TBaseClass<T> = class
            function Equals(Other: T): Boolean;
          end;
           
          TDerivedClass = class(TBaseClass<TDerivedClass>);

        Серьезных неудобств по этому поводу не испытываю

        По-моему это нечто совсем другое :)

        Не совсем, но есть вопрос: какова реализация TBaseClass.Equals в данном случае?

        Добавлено
        Цитата --Ins-- @
        Эээ, и как указать что папарметр дженерика - это тот же тип, что и класс, который от него унаследовался?

        Так же как и в делфи:
        ExpandedWrap disabled
          public interface Base<T extends Base> {
           
              public boolean equalsTo(T other);
          }


        ExpandedWrap disabled
          public class Derived implements Base<Derived> {
           
              public boolean equalsTo(Derived other) {
                  return true;
              }
          }


        Добавлено
        Впрочем это не совсем то, хотя и такой костыль можно использовать для эмуляции.
          Цитата korvin @
          Не совсем, но есть вопрос: какова реализация TBaseClass.Equals в данном случае?


          Не знаю, от конкретики этих классов зависит. Может быть метод и абстрактным, может быть и реализованным в базовом классе полностью или частично

          Цитата korvin @
          Так же как и в делфи:


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

            При чем тут конкретика? Допустим, если в Джаве
            ExpandedWrap disabled
              class Base<T extends Base> {
               
                  private final int id;
               
                  public int getId() {
                      return id;
                  }
               
                  public Base(int id) {
                      this.id = id;
                  }
               
                  public boolean equals(T that) {
                      return this.id == that.id;
                  }
              }

            то в Делфи как?
            ExpandedWrap disabled
              TBase.Equals (Other : T) : Boolean;
              begin
                if Other is TBase then Result := Self.Id = Other.id else Result := False;
              end;

            ?
              Цитата korvin @
              if Other is TBase then Result := Self.Id = Other.id else Result := False;

              Возможно, я тупой, но зачем там else?
                Цитата korvin @
                то в Делфи как?


                Точно так же по-моему нельзя, дженерики в Delphi сырые. Можно немного в обход:

                ExpandedWrap disabled
                  IBase = interface
                    function GetID: Integer;
                  end;
                   
                  TBase<T: IBase> = class(TInterfacedObject, IBase)
                  private
                    FID: Integer;
                    function GetID: Integer;
                  public
                    function Equals(Other: T): Boolean;
                  end;  
                   
                  function TBase<T>.Equals(Other: T): Boolean;
                  begin
                    Result := GetID = Other.GetID;
                  end;
                   
                  function TBase<T>.GetID: Integer;
                  begin
                    Result := FID;
                  end;
                  Цитата Ho Im @
                  Возможно, я тупой, но зачем там else?

                  Чтобы в противном случае результат был бы равен False. Я бы не стал полагаться на то, что булевы переменные по-умолчанию инициализируются False, это может измениться.

                  вообще можно было бы написать так:
                  ExpandedWrap disabled
                    Result := (Other is TBase) and (Self.id = Other.id);

                  но в Delphi, емнип, операнды операторов and и or вычисляются не лениво.
                    Цитата korvin @
                    но в Delphi, емнип, операнды операторов and и or вычисляются не лениво.
                    Лениво - это не вычислять дальнейшие аргументы, если уже известен результат всего выражения? Если да, то вычисления ленивые :)
                      Цитата korvin @
                      но в Delphi, емнип, операнды операторов and и or вычисляются не лениво.


                      все-таки она тебе изменяет
                        And и or вычисляются лениво, если операнды имеют тип Boolean и как обычная операция, если операнды - целые числа (они и для обозначения побитных операций, насколько помню, применяются)
                          korvin
                          лениво или нет вычисляются and и or - зависит от опций компилятора. другое дело, что лично я не видел код, который бы коректно работал с strict вычислением boolean выражений. практически всегда пологаются на ленивость
                            Цитата --Ins-- @
                            все-таки она тебе изменяет

                            Вероятно перепутал с паскалем, где-то в инете натыкался на обсуждение, что
                            ExpandedWrap disabled
                              if (i < n) and (a[i] = 0) then ...
                              // где n - размер массива a

                            выдает ошибку, если i оказывается больше либо равен n

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


                              В паскале, емнип уже у меня, тоже ленивые

                              Добавлено
                              Цитата jack128 @
                              другое дело, что лично я не видел код, который бы коректно работал с strict вычислением boolean выражений. практически всегда пологаются на ленивость


                              Ага, я так и пишу
                              if Assigned(Document) and (Document.Modified) then...

                              Нафиг ифы плодить
                                Цитата --Ins-- @
                                В паскале, емнип уже у меня, тоже ленивые

                                Вероятно то был старый паскаль, хз.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (245) « Первая ... 109 110 [111] 112 113 ...  244 245


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,1190 ]   [ 14 queries used ]   [ Generated: 23.12.25, 17:23 GMT ]