Есть ли будущее у DELPHI?
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.43] |
|
|
Правила раздела:
| Страницы: (245) « Первая ... 109 110 [111] 112 113 ... 244 245 ( Перейти к последнему сообщению ) |
Есть ли будущее у DELPHI?
|
Сообщ.
#1652
,
|
|
|
|
Эээ, и как указать что папарметр дженерика - это тот же тип, что и класс, который от него унаследовался? |
|
Сообщ.
#1653
,
|
|
|
|
Цитата D_KEY @ Цитата --Ins-- @ Я делаю так: ![]() ![]() TBaseClass<T> = class function Equals(Other: T): Boolean; end; TDerivedClass = class(TBaseClass<TDerivedClass>); Серьезных неудобств по этому поводу не испытываю По-моему это нечто совсем другое ![]() Не совсем, но есть вопрос: какова реализация TBaseClass.Equals в данном случае? Добавлено Цитата --Ins-- @ Эээ, и как указать что папарметр дженерика - это тот же тип, что и класс, который от него унаследовался? Так же как и в делфи: ![]() ![]() public interface Base<T extends Base> { public boolean equalsTo(T other); } ![]() ![]() public class Derived implements Base<Derived> { public boolean equalsTo(Derived other) { return true; } } Добавлено Впрочем это не совсем то, хотя и такой костыль можно использовать для эмуляции. |
|
Сообщ.
#1654
,
|
|
|
|
Цитата korvin @ Не совсем, но есть вопрос: какова реализация TBaseClass.Equals в данном случае? Не знаю, от конкретики этих классов зависит. Может быть метод и абстрактным, может быть и реализованным в базовом классе полностью или частично Цитата korvin @ Так же как и в делфи: Так это то же самое что у меня, не совсем то, но можно сделать и так |
|
Сообщ.
#1655
,
|
|
|
|
Цитата --Ins-- @ Не знаю, от конкретики этих классов зависит. Может быть метод и абстрактным, может быть и реализованным в базовом классе полностью или частично При чем тут конкретика? Допустим, если в Джаве ![]() ![]() 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; } } то в Делфи как? ![]() ![]() TBase.Equals (Other : T) : Boolean; begin if Other is TBase then Result := Self.Id = Other.id else Result := False; end; ? |
|
Сообщ.
#1656
,
|
|
|
|
Цитата korvin @ if Other is TBase then Result := Self.Id = Other.id else Result := False; Возможно, я тупой, но зачем там else? |
|
Сообщ.
#1657
,
|
|
|
|
Цитата korvin @ то в Делфи как? Точно так же по-моему нельзя, дженерики в Delphi сырые. Можно немного в обход: ![]() ![]() 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; |
|
Сообщ.
#1658
,
|
|
|
|
Цитата Ho Im @ Возможно, я тупой, но зачем там else? Чтобы в противном случае результат был бы равен False. Я бы не стал полагаться на то, что булевы переменные по-умолчанию инициализируются False, это может измениться. вообще можно было бы написать так: ![]() ![]() Result := (Other is TBase) and (Self.id = Other.id); но в Delphi, емнип, операнды операторов and и or вычисляются не лениво. |
|
Сообщ.
#1659
,
|
|
|
|
Цитата korvin @ Лениво - это не вычислять дальнейшие аргументы, если уже известен результат всего выражения? Если да, то вычисления ленивые но в Delphi, емнип, операнды операторов and и or вычисляются не лениво. |
|
Сообщ.
#1660
,
|
|
|
|
Цитата korvin @ но в Delphi, емнип, операнды операторов and и or вычисляются не лениво. все-таки она тебе изменяет |
|
Сообщ.
#1661
,
|
|
|
|
And и or вычисляются лениво, если операнды имеют тип Boolean и как обычная операция, если операнды - целые числа (они и для обозначения побитных операций, насколько помню, применяются)
|
|
Сообщ.
#1662
,
|
|
|
|
korvin
лениво или нет вычисляются and и or - зависит от опций компилятора. другое дело, что лично я не видел код, который бы коректно работал с strict вычислением boolean выражений. практически всегда пологаются на ленивость |
|
Сообщ.
#1663
,
|
|
|
|
Цитата --Ins-- @ все-таки она тебе изменяет Вероятно перепутал с паскалем, где-то в инете натыкался на обсуждение, что ![]() ![]() if (i < n) and (a[i] = 0) then ... // где n - размер массива a выдает ошибку, если i оказывается больше либо равен n врочем подробностей я не помню, может дело было в чем-то другом, так что пропустим это. |
|
Сообщ.
#1664
,
|
|
|
|
Цитата korvin @ Вероятно перепутал с паскалем, где-то в инете натыкался на обсуждение, что В паскале, емнип уже у меня, тоже ленивые Добавлено Цитата jack128 @ другое дело, что лично я не видел код, который бы коректно работал с strict вычислением boolean выражений. практически всегда пологаются на ленивость Ага, я так и пишу if Assigned(Document) and (Document.Modified) then... Нафиг ифы плодить |
|
Сообщ.
#1665
,
|
|
|
|
Цитата --Ins-- @ В паскале, емнип уже у меня, тоже ленивые Вероятно то был старый паскаль, хз. |