Реализация класса Iterator в Eiffel

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

код:

 t5: BOOLEAN
    local
        bag: MY_BAG[STRING]
        bag3: like bag2
        bag4: MY_BAG[STRING]
    do
        comment("t5:test add_all, remove all, remove")
        bag := <<["nuts", 4], ["bolts", 11], ["hammers", 5]>> -- how to implement it to allow this?
        bag3 := <<["nuts", 2], ["bolts", 6], ["hammers", 5]>>
        -- add_all
        bag3.add_all (bag1)
        Result := bag3 |=| bag
        check Result end
        -- remove_all
        bag3.remove_all (bag1)
        Result := bag3 |=| bag2 and bag3.total = 13
        check Result end
        --remove
        bag4 := <<["nuts", 2], ["bolts", 6]>>
        bag3.remove ("hammers", 5)
        Result := bag3 |=| bag4
    end

    setup  -- inherit from ES_TEST redefine setup end
        -- this runs before every test
    do
        bag1 := <<["nuts", 2], ["bolts", 5]>>
        bag2 := <<["nuts", 2], ["bolts", 6], ["hammers", 5]>>
    end

В настоящее время, когда я компилирую с такими тестовыми примерами, он выдает ошибки компилятора, говорящие о том, что создание является неправильным, несовместимым.

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


person geforce    schedule 10.03.2016    source источник


Ответы (1)


Я считаю, что идея состоит в том, чтобы использовать преобразование вместо простого создания, что-то в этом роде:

class MY_BAG [G]

create
    make

convert
    make ({ARRAY [TUPLE [G, INTEGER]]})

feature {NONE} -- Creation

    make (a: ARRAY [TUPLE [value: G; key: INTEGER]])
        do
            create storage.make (a.count)
            across
                a as c
            loop
                storage.extend (c.item.value, c.item.key)
            end
        end

feature {NONE} -- Storage

    storage: HASH_TABLE [G, INTEGER]

end

Вы также можете посмотреть предложение note в классе HASH_TABLE, чтобы увидеть, подходит ли extend для вашего случая или нужно использовать что-то еще.

person Alexander Kogtenkov    schedule 10.03.2016