Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.49 MB
Время: 0.053 c
15-1177201358
Погуглист
2007-04-22 04:22
2007.05.20
У кого нибудь есть странички на google pages ?


1-1174570621
serg_new
2007-03-22 16:37
2007.05.20
Скачать карты из GoogleMap


2-1177736039
Mical
2007-04-28 08:53
2007.05.20
Скажите, как сделать DBEdit прозрачным?


1-1174637714
tytus
2007-03-23 11:15
2007.05.20
Запущенное приложение и панель задач.


15-1176816514
CCili
2007-04-17 17:28
2007.05.20
Как в голове может остаться хоть что-нить после такого удара?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский