Форум: "Прочее";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];
ВнизБаги компилятора. Опять. Опять. Опять :( Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.047 c