Непонятный случай с наследованием классов

  1. 8 г. назад
    8 г. назад исправил devolonter

    Сегодня наткнулся на непонятное поведение Monkey.
    Например у нас есть некий класс:

    Class SomeAbstract Abstract
    End Class

    От него мы наследуем некий:
    Class Some1 Extends SomeAbstract
    End Class

    Теперь собственно демонстрация непонятного момента:

    Local collection:SomeAbstract[] =[
                    New Some1(),
                    New Some1(),
                    New Some1()]

    Вроде бы всё логично. Массив, содержащий наследников SomeAbstract, но не тут то было:
    Cannot convert from Some1[] to SomeAbstract[].
    И указывает на последний элемент массива.

    Хорошо, подумал я и решил поэкспериментировать:

    Local collection:SomeAbstract[] =[
                    New Some1(),
                    New Some1(),
                    SomeAbstract(New Some1())]

    Работает ლ(ಠ益ಠლ)
    Странное дело, ладно, продолжаем. Добавим ещё одного наследника SomeAbstract:

    Class Some2 Extends SomeAbstract
    End Class

    И код нашего массива:

    Local collection:SomeAbstract[] =[
                    New Some1(),
                    New Some2(),
                    SomeAbstract(New Some1())]

    Мартышка ругается уже иначе:
    Can't balance types Some1 and Some2.
    -_____-
    Окай, продолжаем…

    Local collection:SomeAbstract[] =[
                    SomeAbstract(New Some1()),
                    SomeAbstract(New Some2()),
                    SomeAbstract(New Some1())]

    Работает.

    И вот вопрос.
    Можно заполнить массив без принудительного тайпкаста?
    Почему в первом случае понадобилось приводить только последний элемент?

    Полный код эксперимента: pastebin.com/i28X9Quq

  2. devolonter

    5 Jun 2014 Администратор

    1. Заполнить массив не приводя каждый элемент к конкретному типу, можно просто по каждому индексу отдельно или с помощью цикла:

    Local collection:SomeAbstract[] = New SomeAbstract[6]
            
    For Local i:Int = 0 Until collection.Length() Step 2
            collection[i] = New Some1()
            collection[i + 1] = New Some2()
    Next

    Также можно воспользоваться стэком:

    Local collection:Stack<SomeAbstract> = New Stack<SomeAbstract>()
            
    collection.Push(New Some1())
    collection.Push(New Some1())
    collection.Push(New Some2())
    collection.Push(New Some2())

    2. Это похоже на баг парсера.

или зарегистрируйтесь чтобы комментировать!