Kotlin 创建接口或者抽象类的匿名对象实例

 更新时间:2020年03月26日 11:26:06   作者:三元转换   我要评论
这篇文章主要介绍了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") }
 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 创建接口或者抽象类的匿名对象实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Android使用ViewDragHelper实现图片下拽返回示例

    Android使用ViewDragHelper实现图片下拽返回示例

    这篇文章主要介绍了Android使用ViewDragHelper实现图片下拽返回示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 解决Android 虚拟按键遮住了页面内容的问题

    解决Android 虚拟按键遮住了页面内容的问题

    今天小编就为大家分享一篇解决Android 虚拟按键遮住了页面内容的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Android实现评论栏随Recyclerview滑动左右移动

    Android实现评论栏随Recyclerview滑动左右移动

    这篇文章主要介绍了Android实现评论栏随Recyclerview滑动左右移动效果,仿约会吧应用详情页实现,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Android入门之画图详解

    Android入门之画图详解

    这篇文章主要介绍了Android入门之画图,对Android初学者有很好的学习借鉴价值,需要的朋友可以参考下
    2014-08-08
  • Android中RecyclerView的item宽高问题详解

    Android中RecyclerView的item宽高问题详解

    RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,下面这篇文章主要给大家介绍了关于Android中RecyclerView的item宽高问题的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • Android 使用View Binding的方法详解

    Android 使用View Binding的方法详解

    View Binding是一项功能,使您可以更轻松地编写与视图交互的代码。在模块中启用视图绑定后,它将为该模块中存在的每个XML布局文件生成一个绑定类。这篇文章主要介绍了Android 使用View Binding的方法,需要的朋友可以参考下
    2020-03-03
  • RxRetroHttp为多套API请求适配而生

    RxRetroHttp为多套API请求适配而生

    今天小编就为大家分享一篇关于RxRetroHttp为多套API请求适配而生,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Android NestedScrolling嵌套滚动的示例代码

    Android NestedScrolling嵌套滚动的示例代码

    这篇文章主要介绍了Android NestedScrolling嵌套滚动的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • android 开发 文件读写应用案例分析

    android 开发 文件读写应用案例分析

    在Android应用中保存文件会使用到文件读写技术,本文将详细介绍,需要的朋友可以参考下
    2012-12-12
  • Android Build Variants 为项目设置变种版本的方法

    Android Build Variants 为项目设置变种版本的方法

    下面小编就为大家分享一篇Android Build Variants 为项目设置变种版本的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01

最新评论