@Igor-Novikov

Как вызвать нужный переопределенный метод используя полиформизм?

Пытаюсь разными способами привести экземпляр класса А3 к А2 и вызвать реализацию метода из А2. Всегда вызывается реализация метода из А3. Что я делаю не так?

package advanced_classes

fun main(args:Array<String>){
    val a = A3()
    a.method()

    //1
    (a as? A2)?.method()

    //2
    if(a is A2){
        a.method()
    }

}

open class A1{
    open fun method():Unit{
        println("Method from A1")
    }
}

open class A2:A1(){
    override fun method():Unit{
        println("Method from A2")
    }
}

open class A3:A2(){
    override fun method():Unit{
        println("Method from A3")
    }
}
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
@koperagen
Коротко: В рамках полиморфизма ваша задача решается созданием нового объекта, A2.
Объяснение: Если определить метод в классе-родителе, а затем переопределить его у ребенка, то всегда будет вызван метод фактического класса объекта, т.е. класса чей конструктор был вызван при создании объекта. Вызываемый метод не будет зависеть от типа ссылки на этот объект. За счет этого, собственно, достигается полиморфизм: Вам не нужно знать, какая именно реализация метода у объекта, который вам передали, и вообще реальный класс объекта. Вы объявляете ссылку на интерфейс/абстрактный класс/открытый класс в качестве параметра вашей функции/конструктора вашего класса и работаете с доступными этой ссылке методами, чтобы сделать то, для чего ваша функция/класс предназначен. Тем самым давая возможность клиенту варьировать поведение вашего кода.
Приведение типа дает доступ к специфичным для конкретного класса полям, т.е. был бы в A2 ещё какой-то метод (не реализация метода родителя, а именно что-то свое), после приведения вы могли бы его вызывать. Но это, опять же, не про полиморфизм.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы