Как мне наследовать функцию из другого класса в активность в kotlin? - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть свой собственный SDK-код, где у меня есть класс менеджера, который имеет несколько функций, таких как «function1 (abc, def)», function2 (abc, def) и function3 (abc, def).Теперь у меня есть действие, в котором я пытаюсь использовать эти функции из моего SDK.Как мне унаследовать функции, уже используемые в функциях менеджеров + определить мои собственные?

вот мой код в менеджере:

 override fun function1(reader: Reader?, openType: OpeningType?) {
   some code 
}
 override fun function2(reader: Reader?, openingResult: OpeningResult?) {
 some code 
}
 override fun function3(reader: Reader?, openType: OpeningType?, openingStatus: OpeningStatus?) {
some code
}

Теперь у меня есть действие, где я использую этот SDK в качестве зависимости, и я хотел бы использовать эти функции так, чтобы

class MyActivity : AppCompatActivity(),Managerlistener {
 override fun function1(reader: Reader?, openType: OpeningType?) {
// super. some code? 
     }
     override fun function2(reader: Reader?, openingResult: OpeningResult?) {
// super. some code? 

    }
     override fun function3(reader: Reader?, openType: OpeningType?, openingStatus: OpeningStatus?) {
// super. some code? 

    }


...
}

Теперь вы, возможно, заметили, что я закомментировал код super.some, потому что это Java-способ ведения дел, но я не уверен, что делать с наследованием кода в kotlin (супер эквивалент в kotlin?), Поэтому яможет унаследовать этот код и, кроме того, добавить мой дополнительный код.Как я могу пойти примерно так же?Довольно плохо знаком с kotlin и не уверен насчет используемых конструкций.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Позвольте мне добавить несколько слов к ответу iFanie.

То, что он говорит, правда.В Java, как и в Kotlin, множественное наследование не допускается.Класс может расширять только 1 класс, но может реализовывать множество интерфейсов.

Поскольку Activity является классом, а не интерфейсом, вы не можете расширять второй класс из своей деятельности.

У вас есть2 подхода к решению этой проблемы

  1. Вы можете добавить интерфейс, который заставит вашу деятельность реализовать свои методы.
  2. Вы можете создать новый родительский класс, который будет расширять Activity.Этот родительский класс будет содержать методы, которые вы хотите

У вас будет что-то вроде этого:

Activity <--- CustomParentActivity {doSomething (), doSomethingElse ()} <---YourActualActivity </p>

Еще одна интересная вещь, на которую стоит обратить внимание, - реализации по умолчанию в интерфейсах.С Java 8 вы можете обеспечить реализацию по умолчанию в интерфейсе, который может быть достаточным для ваших нужд.

В Kotlin у вас есть эквивалент, если вы посмотрите на https://kotlinlang.org/docs/reference/interfaces.html

interface MyInterface {
    val prop: Int // abstract

    val propertyWithImplementation: String
        get() = "foo"

    fun foo() {
        print(prop)
    }
}

class Child : MyInterface {
    override val prop: Int = 29
}
0 голосов
/ 11 декабря 2018

Вы не можете наследовать от нескольких суперклассов, поэтому, если ManagerListener - это интерфейс, то, что вы написали, правильно.Что касается супер-вызовов, то же самое в kotlin, но в вашем случае вам это не нужно, так как вы переопределяете методы интерфейса без каких-либо super реализаций.

Кроме того, просто кое-что для вас, чтобы посмотреть, так как это делаетздесь не совсем применимо, в kotlin вы также можете использовать концепцию делегирования, что означает, что вы позволяете экземпляру класса, реализующему интерфейс, давать вашему классу атрибуты этого интерфейса.

...