Переопределение New, почему так не работает?

  1. 9 г. назад

    Итак код:

    Class Class1
            Method New()
                    Print("New()")
            End
            
            Method New(x:Float, y:Float)
                    Print("New(x:Float, y:Float)")
            End
    End
    
    Class Class2 Extends Class1
            
    End
    
    Class TestApp Extends App
            Field class2Inst:Class2
            
            Method OnCreate:Int()
                    fish1 = New Fish(10.0, 10.0)
                    SetUpdateRate(60)
                    Return 0
            End
            ...
    End

    Результат:
    -image-

    Хотя если перенести оба метода New в Class2 то все отработает как надо:
    New(x:Float, y:Float)

    И еще если перенести только метод New(x:Float, y:Float) в Class2, а New() оставить в Class1 — результат будет следующим:
    New()
    New(x:Float, y:Float)

    Поясните пожалуйста почему так происходит и как с этим бороться?

  2. devolonter

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

    В классах Monkey всегда присутствует конструктор без параметров, даже если вы его перегрузили:

    Class A
    End Class
    
    Class B Extends A
        Method New(dummy:Int)
            Print("Hello B! " + dummy)
        End Method
    End Class
    
    Function Test:Void()
        Local a := New A()
        Local b := New B() ' ошибки нет!
    End Function

    Впрочем, можно написать так:

    Class A
    End Class
    
    Class B Extends A
        Method New(dummy:Int = 0) ' (!)
            Print("Hello B! " + dummy)
        End Method
    End Class
    
    Function Test:Void()
        Local a := New A()
        Local b := New B() ' выведет "Hello B! 0"
    End Function

    Конструкторы в Monkey не наследуются:

    Class A
        Method New(dummy:Int)
            Print("Hello A! " + dummy)
        End Method
    End Class
    
    Class B Extends A
        Method New()
            Print("Hello B!")
        End Method
    End Class
    
    Function Test:Void()
        Local a := New A(1) '
        Local b := New B(1) ' --- Monkey сообщит об ошибке "Error : Unable to find overload for new(Int)."
    End Function

    Но конструктор родительского класса можно вызвать с помощью Super.New(параметры):

    Class A
        Method New(dummy:Int)
            Print("Hello A! " + dummy)
        End Method
    End Class
    
    Class B Extends A
        Method New()
            Super.New(1)
        End Method
    End Class
    
    Function Test:Void()
        Local b := New B() ' выведет "Hello A! 1"
    End Function

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