Kotlin创建接⼝或者抽象类的匿名对象实例
⼀,定义接⼝和抽象类
interface IPerson{
//获取名字
fun getName():String
//获取⾝份证ID
fun getID():String
}
abstract class BaseAnimal{
abstract fun getVoice():String
}
⼆,创建对应的匿名对象
object : IPerson {
override fun getName(): String = "jason"
override fun getID(): String = "00000123"
}
object : BaseAnimal() {
override fun getVoice() = "旺旺叫"
}
补充知识:android Kotlin 继承、派⽣、接⼝、构造⽅式,⽅法、属性重写
前⾔
kotlin 作为google官⽅android 开发语⾔,⼤势所趋,据传到2018底kotlin要全⾯替代java在android中的地位,其实这个也不担⼼毕竟kotin和java可以100%互操作。两种语⾔进⾏编写也是可以的。
Kotlin 继承
1.使⽤ open 关键字进⾏修饰
2.主构造函数紧跟着在类后⾯声明的函数
open class Person(var name : String, var age : Int){// 基类
}
class Student(name : String, age : Int, var no : String, var score : Int) : Person(name, age) {
}
// ⼆级构造函数
calss Student : Person {
constructor(ctx: Context) : super(ctx) {
}
constructor(ctx: Context, attrs: AttributeSet) : super(ctx,attrs) {
}
}
另⼀种写法,基类构造函数,次级构造函数
/**⽤户基类**/
open class Person(name:String){
/**次级构造函数**/
constructor(name:String,age:Int):this(name){
//初始化
println("-------基类次级构造函数---------")
}
}
/**⼦类继承 Person 类**/
class Student:Person{
/**次级构造函数**/
constructor(name:String,age:Int,no:String,score:Int):super(name,age){
println("-------继承类次级构造函数---------")
println("学⽣名: ${name}")
println("年龄: ${age}")
println("学⽣号: ${no}")
println("成绩: ${score}")
}
}
fun main(args: Array<String>) {
var s = Student("Runoob", 18, "S12345", 89)
}
⽅法重写
基类fun函数默认 final 修饰符,⽆法在⼦类进⾏重写
需要加上 open 修饰符号
⽅法获得,同名⽅法获得
⼀个类从其他类或者接⼝(继承实现来的⽅法),同名⽅法,在⼦类中必须显⽰进⾏调⽤
open class A {
open fun f () { print("A") }
kotlin修饰符fun a() { print("a") }
}
interface B {
fun f() { print("B") } //接⼝的成员变量默认是 open 的
fun b() { print("b") }
}
class C() : A() , B{
override fun f() {
super<A>.f()//调⽤ A.f()
super<B>.f()//调⽤ B.f()
}
}
fun main(args: Array<String>) {
val c = C()
c.f();
}
open class A {
open fun f () { print("A") }
fun a() { print("a") }
}
interface B {
fun f() { print("B") } //接⼝的成员变量默认是 open 的
fun b() { print("b") }
}
class C() : A() , B{
override fun f() {
super<A>.f()//调⽤ A.f()
super<B>.f()//调⽤ B.f()
}
}
fun main(args: Array<String>) {
val c = C()
c.f();
}
属性重写
属性重写使⽤ override 关键字,属性必须具有兼容类型,每⼀个声明的属性都可以通过初始化程序或者getter⽅法被重写:open class Foo {
open val x: Int get { …… }
}
class Bar1 : Foo() {
override val x: Int = ……
}
你可以⽤⼀个var属性重写⼀个val属性,但是反过来不⾏。因为val属性本⾝定义了getter⽅法,重写为var属性会在衍⽣类中额外声明⼀个setter⽅法
你可以在主构造函数中使⽤ override 关键字作为属性声明的⼀部分:
interface Foo {
val count: Int
}
class Bar1(override val count: Int) : Foo
class Bar2 : Foo {
override var count: Int = 0
}
Kotlin 接⼝
Kotlin 接⼝与 Java 8 类似,使⽤ interface 关键字定义接⼝,允许⽅法有默认实现:
interface MyInterface {
fun bar() // 未实现
fun foo() { //已实现
// 可选的⽅法体
println("foo")
}
}
接⼝中的属性
接⼝中的属性只能是抽象的,不允许初始化值,接⼝不会保存属性值,实现接⼝时,必须重写属性:
interface MyInterface{
var name:String //name 属性, 抽象的
}
class MyImpl:MyInterface{
override var name: String = "runoob" //重载属性
}
函数重写
实现多个接⼝时,可能会遇到同⼀⽅法继承多个实现的问题。例如:
实例
interface A {
fun foo() { print("A") } // 已实现
fun bar() // 未实现,没有⽅法体,是抽象的
}
interface B {
fun foo() { print("B") } // 已实现
fun bar() { print("bar") } // 已实现
}
class C : A {
override fun bar() { print("bar") } // 重写
}
class D : A, B {
override fun foo() {
super<A>.foo()
super<B>.foo()
}
override fun bar() {
super<B>.bar()
}
}
fun main(args: Array<String>) {
val d = D()
d.foo();
d.bar();
}
输出结果为:
ABbar
实例中接⼝ A 和 B 都定义了⽅法 foo() 和 bar(),两者都实现了 foo(), B 实现了 bar()。因为 C 是⼀个实现了 A 的具体类,所以必须要重写 bar() 并实现这个抽象⽅法。
然⽽,如果我们从 A 和 B 派⽣ D,我们需要实现多个接⼝继承的所有⽅法,并指明 D 应该如何实现它们。
这⼀规则既适⽤于继承单个实现(bar())的⽅法也适⽤于继承多个实现(foo())的⽅法。
以上这篇Kotlin 创建接⼝或者抽象类的匿名对象实例就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论