Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.20;
Скачать: CL | DM;

Вниз

Баги компилятора. Опять. Опять. Опять :(   Найти похожие ветки 

 
oxffff ©   (2007-04-21 21:03) [0]

При for-in loop компилятор напрямую линкует вызов метода GetEnumerator

Код проверки ниже.

IEnumerator=interface
function MoveNext:boolean;
function GetCurrent:pointer;
property Current:pointer read GetCurrent;
end;

TAbstractContainerBase=class
public
function GetEnumerator:IEnumerator;virtual;
end;

TChildContainer=class(TAbstractContainerBase)
public
function GetEnumerator:IEnumerator;override;
end;

{ TAbstractContainerBase }

function TAbstractContainerBase.GetEnumerator: IEnumerator;
begin
showmessage("Get Base Enumerator");
result:=nil;
end;

{ TChildContainer }

function TChildContainer.GetEnumerator: IEnumerator;
begin
showmessage("Get child Enumerator");
result:=nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:TAbstractContainerBase;
   b:pointer;
begin
a:=TChildContainer.Create;
for b in a do
  begin
  end;
end;


 
oxffff ©   (2007-04-21 21:49) [1]

>При for-in loop компилятор напрямую линкует вызов метода GetEnumerator

При for-in loop компилятор напрямую линкует вызов виртуального метода GetEnumerator


 
oxffff ©   (2007-04-22 10:09) [2]

Я уже написал на qc об этой ошибке для 2006

Подскажите 2007 ведет себя также?


 
default ©   (2007-04-22 11:45) [3]

а почему в интерфейсе нет чего-то подобного методу Reset/First/..?


 
oxffff ©   (2007-04-22 12:06) [4]


> а почему в интерфейсе нет чего-то подобного методу Reset/First/.
> .?


А вы читали help?

To use the for-in loop construct on a class, the class must implement a prescribed collection pattern. A type that implements the collection pattern must have the following attributes:

The class must contain a public instance method called GetEnumerator(). The GetEnumerator() method must return a class, interface, or record type.
The class, interface, or record returned by GetEnumerator() must contain a public instance method called MoveNext(). The MoveNext() method must return a Boolean.
The class, interface, or record returned by GetEnumerator() must contain a public instance, read-only property called Current. The type of the Current property must be the type contained in the collection.


 
default ©   (2007-04-22 13:54) [5]

я не работаю с Delphi сейчас, в .NET по иному

с помощью такого итератора ведь можно только один раз пробежаться по коллекции либо интерфейс итератора будет неестественным для многократного пробега

или для многократного пробега я должен каждый раз дёргать GetEnumerator у класса?


 
jack128 ©   (2007-04-22 14:28) [6]

default ©   (22.04.07 13:54) [5]
или для многократного пробега я должен каждый раз дёргать GetEnumerator у класса?

Для многократного пробега, ты можешь дергать что хочешь, но синтаксис оператора for in - такого не предусматривает.


 
default ©   (2007-04-22 14:30) [7]

jack128 ©   (22.04.07 14:28) [6]
штука в том, что я могу бегать и без for in через такой интерфейс
и получается, что этот интерфейс - одноразовый, это несколько галимая архитектура, в .NET всё куда разумней, просто оттуда бы слизали, да и не парились


 
default ©   (2007-04-22 14:39) [8]

в .NET есть просто стандартный интерфейс для пробега по элементам произвольной коллекции, для многократного пробега
и в .NET языки(не обязательно все) добавляется "синтаксический сахар" в форме конструкции for each просто облегчающий использование этого интерфейса
а тут этот интерфейс узкоспециализированный(то есть в основном только для for in)
а если мне потребуется полноценный итератор, мне придётся создавать свой интрфейс или наследоваться от этого
это есть галимая архитектура


 
jack128 ©   (2007-04-22 14:40) [9]

default ©   (22.04.07 14:30) [7]
штука в том, что я могу бегать и без for in через такой интерфейс


Штука в том, что бегать по целым числам от min до max и без цикла for i := min to max do . Получается этот вид цикла - одноразовый, это несколько галимая архитектура.  ;-)


 
jack128 ©   (2007-04-22 14:42) [10]

default ©   (22.04.07 14:39) [8]
кстати, for in не привязан к интерфейсам.  rtfm типа ;-)


 
default ©   (2007-04-22 14:48) [11]

jack128 ©   (22.04.07 14:42) [10]
я видел:)
oxffff показывал

просто удобно говорить о каком-то одном типе:)
меньше слов

я понимаю, что это не особо принципиально, ибо многократный пробег используется уж очень редко

но сама идея "одноразовых интерфейсов"  мне не нравится, чисто эстетически:)


 
oxffff ©   (2007-04-22 15:41) [12]

Собственно проблема в том, что это не работает нормально.

А компилятор линкует вызов виртуальной функции напрямую.

Прощай полиморфизм.


 
DrPass ©   (2007-04-22 17:16) [13]


> Прощай полиморфизм

А смысла в таком полиморфизме? В каком случае может потребоваться перегружать GetEnumerator? Если класс реализует коллекцию, то можно его расширять, расширять элементы коллекции... но ради бога, на кой ляд менять сам механизм выборки элементов коллекции.
Нет, я согласен, это некорректное поведение компилятора,баг. Но его критичность - 0.0%


 
oxffff ©   (2007-04-22 17:26) [14]


> Если класс реализует коллекцию,


> А смысла в таком полиморфизме?



> но ради бога, на кой ляд менять сам механизм выборки элементов
> коллекции.


1. Если это абстрактный класс
2. Если нужна например reverse выборка


 
jack128 ©   (2007-04-22 20:37) [15]

Ну можно сделать статический метод GetGetEnumerator а Из него вызывать виртуальный DoGetEnumerator...


 
oxffff ©   (2007-04-23 00:29) [16]


> Ну можно сделать статический метод GetGetEnumerator а Из
> него вызывать виртуальный DoGetEnumerator...


С такими ошибками и таким их количеством.
Выход один надо править команду R&D. IMHO


 
oxffff ©   (2007-04-23 22:29) [17]

Если кому несложно и не жаль интернета
проголосуйте за
http://qc.codegear.com/wc/qcmain.aspx?d=44797



Страницы: 1 вся ветка

Текущий архив: 2007.05.20;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.06 c
15-1177331169
NewUser2
2007-04-23 16:26
2007.05.20
Найти....


6-1163694731
Tiberius
2006-11-16 19:32
2007.05.20
Текст из браузера


3-1173159322
Atanas
2007-03-06 08:35
2007.05.20
Структура таблиц


2-1177931656
allucard
2007-04-30 15:14
2007.05.20
Функция PaintTo - как убрать рамку?


15-1176934894
vasIZmax
2007-04-19 02:21
2007.05.20
Re: Опрос