Kotlin 抽象类

文章目录

  • 定义
  • 构造函数
  • 普通成员(属性或方法)
  • 抽象成员(属性或方法)
  • 实例化抽象类
  • 使用伴生对象继承抽象类

定义

在 Kotlin 中,抽象类使用abstract class定义:

abstract class 类名 { 属性/方法 }

我们可以尝试定义一个抽象类:

abstract class Provider

Note:很多情况下抽象类与接口功能其实是差不多的,它们有以下差异:

  • 抽象类可以有构造函数,而接口有。
  • 抽象类中属性可以初始化,而接口只能通过属性get方法给值。
  • 同一个类只能继承一个抽象类,但可以实现多个接口。
  • 抽象类中可以有protected成员(属性或变量),而接口中有。
  • 抽像类中定义的初始化的属性有方法体的方法默认是不可被重写的,而接口中的有方法体的方法默认可被重写(默认被标记为open)。
  • 等等。

构造函数

我们可以像类class那样给抽象类定义主、次构造:

abstract class Provider(val source: String) {constructor(): this("Input")
}

普通成员(属性或方法)

抽象类中可以直接定义并初始化属性,定义方法并给出方法体:

abstract class Provider {val name = "提供者"fun provide() = print("由 $name 提供")
}

抽象成员(属性或方法)

抽象类中的抽象成员必须使用abstract修饰:

abstract class Provider {abstract val name: Stringabstract fun provide()
}

实例化抽象类

与接口类似,我们可以声明一个类型为Any的对象:

fun main() {val any: Any = object {}
}

再让其继承自Provider(与接口不同,这里需要在类名后加上小括号(),如果类构造有参数,也要传入):

abstract class Provider {abstract val name: Stringabstract fun provide()
}fun main() {val provider = object: Provider() {}
}

鼠标点击标红的object,暂停一段时间(或者按下键盘上的Alt+Enter(回车)),点击实现成员,并在新弹窗中点击确定,即可生成代码。
在这里插入图片描述

fun main() {val provider = object: Provider() {override val name: Stringget() = TODO("Not yet implemented")override fun provide() {TODO("Not yet implemented")}}
}

稍加修改一下,并使用provider调用provide

fun main() {val provider = object: Provider() {override val name = "提供者"override fun provide() = print("由 $name 提供")}provider.provide()
}
由 提供者 提供

使用伴生对象继承抽象类

我们可以使用companion object继承自抽象类,调用时只需要使用类名即可:

abstract class Provider {abstract val name: Stringabstract fun provide()companion object : Provider() {override val name = "提供者"override fun provide() = print("由 $name 提供")}
}fun main() {Provider.provide()
}
由 提供者 提供

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/22563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React - 实现走马灯组件

一、实现效果 二、源码分析 import {useRef, useState} from "react";export const Carousel () > {const images [{id: 3, url: https://sslstage3.sephorastatic.cn/products/2/4/6/8/1/6/1_n_new03504_100x100.jpg}, {id: 1, url: https://sslstage2.sephor…

RabbitMQ docker安装及使用

1. docker安装RabbitMQ docker下载及配置环境 docker pull rabbitmq:management # 创建用于挂载的目录 mkdir -p /home/docker/rabbitmq/{data,conf,log} # 创建完成之后要对所创建文件授权权限,都设置成777 否则在启动容器的时候容易失败 chmod -R 777 /home/doc…

团队项目开发使用git工作流(IDEA)【精细】

目录 开发项目总体使用git流程 图解流程 1.创建项目仓库[组长完成] 2. 创建项目,并进行绑定远程仓库【组长完成】 3.将项目与远程仓库(gitee)进行绑定 3.1 创建本地的git仓库 3.2 将项目添加到缓存区 3.3 将项目提交到本地仓库&#…

102、python-第三阶段-11-数据输出-输出到文件中

配置完成后,再次执行代码,发现输出的文件有好多,和电脑的内核数量有关系 这样就可以分别输出到一个对应的文件了

攻防世界---misc---normal_png

1、下载附件是一张图片 2、先看这张照片,我感觉它的宽高不一样,感觉有问题,但是我也没深想 3、接着用winhex分析,也没有发现奇怪的地方,于是我去binwalk,没什么发现,就是一张正常的图片&#x…

【Vue】Vue生命周期

Vue生命周期:就是一个Vue实例从创建(new一个Vue实例) 到 销毁(关闭网页) 的整个过程。 生命周期四个阶段:① 创建 ② 挂载 ③ 更新 ④ 销毁 创建阶段:创建响应式数据 通过data给当前的Vue实例提…

树莓集团:产学研一体化发展

树莓集团,通过与高校、研究机构等合作,旨在促进科技成果的转化和应用,提高技术创新能力,实现经济社会可持续发展。深刻认识产学研一体化对于推动产业创新、提升竞争力的关键作用。 1、与高校合作 紧密合作:树莓集团与…

Day08 备忘录页面设计

​ 当前章节完成后效果图 一.布局设计和生成静态数据 当前章节备忘录页面布局设计跟 第7章节一样,只是内容方面发生变化,其他样式都一样。直接把代码粘出来了当前章节备忘录 MemoView.xaml 页面完整示例代码 <UserControl x:Class="MyToDo.Views.MemoView"xmlns…

Python | 刷题日记

1.海伦公式求三角形的面积 area根号下&#xff08;p(p-a)(p-b&#xff09;(p-c)) p是周长的一半 2.随机生成一个整数 import random xrandom.randint(0,9)#随机生成0到9之间的一个数 yeval(input("please input:")) if xy:print("bingo") elif x<y:pri…

python数据分析——逻辑回归

参考资料&#xff1a;活用pandas库 逻辑回归 当响应变量为二值响应变量时&#xff0c;经常使用逻辑回归对数据建模。 # 导入pandas库 import pandas as pd # 导入数据集 acspd.read_csv(r"...\data\acs_ny.csv") # 展示数据列 print(acs.columns) # 展示数据集 pri…

[数据集][图像分类]茶叶叶子病害分类数据集304张4类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;304 分类类别数&#xff1a;4 类别名称:[“anthracnose”,“bird_eye_spot”…

功效系数法

功效系数法&#xff08;Efficacy Coefficient Method&#xff09;是一种综合评价方法&#xff0c;它根据多目标规划的原理&#xff0c;对每个评价指标确定一个满意值和不允许值&#xff0c;以满意值为上限&#xff0c;以不允许值为下限。计算各指标实现满意值的程度&#xff0c…

ant-design vue3 中上传图片组件的回传图片显示问题

最近在做web端的上传图片 有一个数据列表中的编辑功能 是之前上传的图片 点击编辑进入编辑页面 会显示之前写的数据 现在需要把原来上传的图片 显示出来 因为之前给后端上传的 图片格式 是一个数组 ["图片链接"&#xff0c;“图片链接”。。。] 后端给我返回的数据也…

ESP32 ESP8266 Arduino开发环境离线安装

在下面链接中详细介绍了ESP32 ESP8266在线安装方法&#xff0c; 智能红外遥控器&#xff08;二&#xff09;&#xff1a; Arduino环境搭建及库安装_arduino ide 1.8.13-CSDN博客 但是由于在线安装受国外服务器的影响很多时间会不成功&#xff0c;下面介绍使用离线安装包的方法…

AI视频教程下载:给初学者的ChatGPT提示词技巧

你是否厌倦了花费数小时在可以通过强大的语言模型自动化的琐碎任务上&#xff1f;你是否准备好利用 ChatGPT——世界上最先进的语言模型——并将你的生产力提升到下一个水平&#xff1f; ChatGPT 是语言处理领域的游戏规则改变者&#xff0c;它能够理解并响应自然语言&#xf…

JavaWeb基础(JQuery,XML及解析)

这个阶段有点拖沓了&#xff0c;因为事情比较多&#xff0c;耽搁了一段时间&#xff0c;学习的主要内容为JQuery和XML&#xff0c;因为vue的出现&#xff0c;JQuery技术现在已经不流行了&#xff0c;但是不流行不代表我不会&#xff0c;JQuery最最最最核心的就是他的$()核心函数…

十大排序 —— 希尔排序

十大排序 —— 希尔排序 什么是希尔排序插入排序希尔排序递归版本 我们今天来看另一个很有名的排序——希尔排序 什么是希尔排序 希尔排序&#xff08;Shell Sort&#xff09;是插入排序的一种更高效的改进版本&#xff0c;由Donald Shell于1959年提出。它通过比较相距一定间…

路由策略案例

一、路由策略案例 如图所示&#xff0c;某公司内终端通过Switch接入公司内部网络。如果该公司内存在非如图1所示&#xff0c;运行OSPF协议的网络中&#xff0c;RouterA从Internet网络接收路由&#xff0c;并头RouterB提供了部分Internet路由。其中: RouterA仅提供172.1…

工厂模式——工厂方法模式+注册表

工厂方法模式的瑕疵 在前一篇笔记中我们介绍了工厂方法模式&#xff0c;示例的类图如下&#xff1a; 考虑一种情况&#xff1a;现在要在程序运行时&#xff0c;根据外部资源&#xff0c;动态的实例化对象。也就是说在编译期我们无法知道要实例化的对象的类型。因此在实例化的过…

Java 新手入门:基础知识点一览

Java 新手入门&#xff1a;基础知识点一览 想要踏入 Java 的编程世界&#xff1f;别担心&#xff0c;这篇文章将用简单易懂的表格形式&#xff0c;带你快速了解 Java 的基础知识点。 一、Java 是什么&#xff1f; 概念解释Java一种面向对象的编程语言&#xff0c;拥有跨平台、…