首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin类型系统-如何将属性“添加”到两个相关类的子类

Kotlin类型系统允许我们通过继承和扩展来将属性添加到相关类的子类中。下面是一种实现方式:

  1. 首先,我们需要定义一个父类,该父类包含我们想要添加的属性。例如,我们定义一个名为Person的父类,其中包含一个name属性:
代码语言:txt
复制
open class Person(val name: String)
  1. 接下来,我们定义两个相关的子类,它们继承自父类Person。例如,我们定义一个名为Student的子类和一个名为Teacher的子类:
代码语言:txt
复制
class Student(name: String, val grade: Int) : Person(name)

class Teacher(name: String, val subject: String) : Person(name)

在这里,Student类和Teacher类都继承了Person类,并且分别添加了额外的属性gradesubject

  1. 现在,我们可以创建StudentTeacher的实例,并访问它们的属性:
代码语言:txt
复制
val student = Student("Alice", 10)
println(student.name)   // 输出:Alice
println(student.grade)  // 输出:10

val teacher = Teacher("Bob", "Math")
println(teacher.name)    // 输出:Bob
println(teacher.subject) // 输出:Math

在这个例子中,我们创建了一个Student对象和一个Teacher对象,并分别访问了它们的属性。

总结: Kotlin类型系统允许我们通过继承和扩展来将属性添加到相关类的子类中。我们可以定义一个父类,包含我们想要添加的属性,然后定义相关的子类,继承父类并添加额外的属性。这种方式可以帮助我们在不改变原有类结构的情况下,为相关类添加新的属性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

泛型相关时,如何在两个泛型之间创建类似子类型关系呢

尽管Integer是Number子类型,但Box 和Box不是Box子类,它俩对象是Object。文首对话表达就是这个意思。...那么问题来了,当泛型相关时,如何在两个泛型之间创建类似子类型关系呢?例如如何让Box 和Box变得与Box有关呢?...为了搞懂这个问题,我们先来了解一下同一类型对象是如何实现子类型吧。...小结:可以通过继承泛型或者实现接口来对其进行子类型化。 搞懂了子类型问题,我们回到“如何在两个泛型之间创建类似子类型关系“问题。...泛型或者接口并不会仅仅因为它们类型之间有关系而变得相关,如果要达到相关,我们可以使用通配符来创建泛型或接口之间关系。

2.8K20

Kotlin入门(14)继承那些事儿

博文《Kotlin入门(13)成员众生相》在演示成员时多次重写了WildAnimal,这下你兴冲冲地准备按照MainActivity继承方式,从WildAnimal派生出一个子类Tiger,写好构造函数两个输入参数...val sex:Int = 0) { //此处暂时省略基内部成员属性和方法 } 现在有了基框架,还得往里面补充成员属性和成员方法,然后给这些成员添加开放性修饰符。...那么Kotlin体系参照Java世界也给出了四个开放性修饰符,按开放程度从高低分别是: public : 对所有人开放。Kotlin、函数、变量不加开放性修饰符的话,默认就是public类型。...按照以上开放性相关说明,接下来分别给Bird名、函数名、变量名加上修饰符,改写之后代码是下面这样: //Kotlin默认是不能继承(即final类型),如果需要继承某类,则该父应当声明为...继承与Java相比有所不同,首先Kotlin默认不可被继承,如需继承则要添加open声明;而Java默认是允许被继承,只有添加final声明才表示不能被继承。

1.5K50

Kotlin 漫谈系列之类与继承

Kotlin 可以通过在主构造函数参数前面添加 val 或者 var 修饰符,这样主构造函数参数就变成了属性,这样就不需要再在里面定义同样属性再赋值了。 Swift: 666,?。...Swift 有方法和实例方法,用 class 或 static 关键字修饰方法就是方法,这两个关键字区别是 class 修饰方法可以被子类复写,static 修饰方法不行。...Kotlin: Kotlin 不但默认是静态,函数也是静态,如果一个函数需要被重写,我们必须手动让他变成开放,即在函数前面添加 open 关键字。...关键字,覆盖属性类型必须兼容。...用 class 或 static 关键字修饰方法就是方法,这两个关键字区别是 class 修饰方法可以被子类复写,static 修饰方法不行。

3.6K40

第3章 Kotlin 可空类型类型系统第3章 Kotlin 可空类型类型系统

通常,编程语言中类型系统中定义了 如何将数值和表达式归为不同类型 如何操作这些类型 这些类型之间如何互相作用 我们在编程语言中使用类型目的是为了让编译器能够确定类型所关联对象需要分配多少空间。...同理,在Kotlin中非空数字类型Int 可空数字类型Int? 需要进行装箱操作。 同时,非空Int类型会被编译器自动拆箱成基本数据类型 int , 存储时候也会存到栈空间。...Goo null >>> goo as Foo Line71$Goo@73dce0e6 我们可以看出,在Kotlin中,父是禁止转换为子类型。...按照Liskov替换原则,父转换为子类是对OOP严重违反,不提倡、也不建议。...严格来说,父是不能转换为子类子类包含了父所有的方法和属性,而父则未必具有和子类同样成员范围,所以这种转换是不被允许,即便是两个具有父子关系类型,也是如此。

2.1K20

使用 Kotlin 重写 AOSP 日历应用

因为团队中有两个人在进行此项工作,所以我们在 Android.bp 文件中为每个人创建了一个 exclude_srcs 属性,这样两个人就可以在减少代码合并冲突前提下,都能够同时进行重构并推送代码。...在 Kotlin 中,要将一个标记为可继承,必须得在声明中添加 open 关键字,对于父中被子类覆盖方法也要这样做。但是在 Java 中继承是不需要使用到 open 关键字。...覆写父属性 在重构过程中,我们还遇到了一个属性覆写异常问题,当一个子类声明了一个变量,而在父中存在一个非私有的同名变量时,我们需要添加一个 override 修饰符。...然而,即使子类变量同父变量类型不同,也仍然要添加 override 修饰符。在某些情况下,添加 override 仍不能解决问题,尤其是当子类类型完全不同时候。...事实上,如果类型不匹配,在子类变量前添加 override 修饰符,并在父变量前添加 open 关键字,会导致一个错误: type of *property name* doesn’t match

1.1K10

第4章 与面向对象编程第4章 与面向对象编程

第4章 与面向对象编程 在前面的章节中,我们学习了Kotlin语言基础知识、类型系统相关知识。在本章节以及下一章中,我们将一起来学习Kotlin对面向对象编程以及函数式编程支持。...4.每个对象都拥有其类型,每个对象都是某个一个实例,每一个区别于其它特性就是可以向它发送什么类型消息,也就是它定义了哪些成员函数。 5.某一个特定类型所有对象都可以接受同样消息。...,子类不能够继承; 3.对于子类可以继承成员变量,如果在子类中出现了同名称成员变量,则会发生隐藏现象,即子类成员变量会屏蔽掉父同名成员变量。...如果要在子类中访问父中同名成员变量,需要使用super关键字来进行引用。 4.3.2 接口 接口是一种比抽象更加抽象”。接口本身代表是一种“类型概念。...枚举两个内置属性: public final val name: String public final val ordinal: Int 分别表示是枚举对象值跟下标位置。

1.7K20

深入理解Kotlin泛型系统

在 Java 中,只要是有类型 API 元素,都可以泛型化,也就是泛型、泛型接口、泛型方法和泛型属性,泛型和泛型接口可以统称为泛型类型。...其中最重要是泛型类型和泛型方法,Kotlin 泛型系统继承了 Java 泛型系统,同时添加了一些强化地方。...方法中,则是需要类型参数 E 能够被 Comparator 中方法传入,所以也就需要保证 E 是 Comparator 类型参数子类。...而 Kotlin 中,针对于这两种情况给了另外两个关键字:需要读取带泛型对象值时,使用 out 来标记类型参数;需要传入类型参数类型作为形参时,使用 in。...在 Kotlin 中,被 out 标记类型参数类型称之为协变类型,它代表当 A 是 B 子类时,C 也能作为 C 子类使用;而被 in 标记类型参数类型则相反,它代表当 A 是 B子类时,C

1.1K10

《Kotin 极简教程》第7章 面向对象编程(OOP)(1)第7章 面向对象编程(OOP)《Kotlin极简教程》正式上架:

有任何问题,欢迎随时与我交流~ ---- 在前面的章节中,我们学习了Kotlin语言基础知识、类型系统、集合以及泛型相关知识。...属性 我们再给这个World加入两个属性。...如果一个继承了某个抽象,则子类必定是抽象种类,而接口实现就不需要有这层类型关系。 设计层面不同,抽象作为很多子类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。...也就是说: 对于抽象,如果需要添加方法,可以直接在抽象添加具体实现,子类可以不进行变更; 而对于接口则不行,如果接口进行了变更,则所有实现这个接口都必须进行相应改动。...如果在你设计中有两个类型关系并不是is a,而是is like a,那就必须慎重考虑继承。因为一旦我们使用了继承,就要小心处理好子类跟父耦合依赖关系。组合优于继承。

1.1K20

Kotlin 程序设计》第三章 Kotlin 类型系统第三章 Kotlin 类型系统基本数据类型2.字符类型CharKotlin类型系统参考资料

类型系统用于定义如何将编程语言中数值和表达式归类为许多不同类型,如何操作这些类型,这些类型如何互相作用。...类型系统在各种语言之间有非常大不同,也许,最主要差异存在于编译时期语法,以及运行时期操作实现方式。(百度百科) 本章我们主要简单介绍Kotlin类型相关知识。... — Double类型数组 这些和 Array 并没有继承关系,但是它们有同样方法属性集。...并且每个其他类型是此根类型子类型Kotlin根对象Any Kotlin中所有对象皆继承自Any。...extends T 表明这个方法接受 T子类型对象集合,并非T本身。这意味着,可以从列表中安全读取T(集合中所有的元素都是T一个子类),但是我们无法写入因为我们并不知道哪些是T子类

1.3K30

Kotlin | 一份10万字随查笔记,妈妈再也不担心我不会Ctrl+F了

一些看过个人感受: Kotlin核心编程 水滴技术团队出,从Kotlin背景各种使用细节都有概述,说它是一本神书(工具书,No)不足为过。...1.认识基本类型 2.初步认识及其相关概念 3.认识区间和数组 基本类型 拆箱装箱与Chart数据类型 int anInt = 5 Integer anInteger = 5 在Kotlin 里面...泛华类型或者说类型抽象 鸭子类型是动态类型和静态语言一种对象推断分格,在鸭子类型中,关注不是对象类型本身,而是他是如何使用,也就是说我们只关注它行为。...密封是一种特殊抽象 密封子类定义在自身相同文件中 密封子类个数有限 简单来说,密封相当于一事物具体子分类,有明确类型区别,子类有具体个数。...实例化 状态可数 子类可数 实例可数 状态差异 类型差异 值差异 内联 inline class 内联是对某一个类型包装 内联是类似于 Java 装箱类型一种类型 编译器会尽可能使用被包装类型进行优化

2.6K20

From Java To Kotlin 2:Kotlin 类型系统与泛型终于懂了

带来 表达式思维、子类型化、类型系统、泛型。 From Java to Kotlin 关键在于 **思维转变**。 # 表达式思维 Kotlin 中大部分语句是**表达式**。...# Kotlin 类型系统 ## 类型子类型 - (class)是指一种数据类型,定义定义对象属性和方法,可以用来创建对象实例,例如 `class Person(val name: String...** 因为在Java中,类型大部分情况下都是“等价”(在Java泛型出现前)。事实上,“继承”和“子类型化”是两个**完全不同概念**。子类型核心是**一种类型替代关系**。...- 正是因为 Kotlin类型系统中加入了 Unit、Nothing 这两个类型,才让大部分无法产生值**语句**摇身一变,成为了**表达式**。...在 Java 中,我们常见泛型有:泛型、泛型接口、泛型方法和泛型属性Kotlin 泛型系统继承了 Java 泛型系统,同时添加了一些强化地方。

41850

干货 | Kotlin超棒语言特性

表达式,Kotlin还有个大杀器叫Elvis表达式,即?: 表达式,这两个表达式加在一起可以以超简洁形式表述一个复杂逻辑。 ? 以上面表达式为例,我们以红线把它划分成两个部分。...这个特性将数字字面量,字符串字面量扩展一般性对象中了。对应场景是如果我们只需要“一个对象而已”,并不需要特殊超类型。...考虑下面四种场景: 在变量定义中,代表变量类型定义中,代表基类型 在函数定义中,代表函数返回值类型 在匿名对象中,代表对象类型 笼统来说,Kotlin设计者应该就是想用冒号来笼统表示类型这一概念...同样,委托也是一种设计模式,它结构如下图所示: ? Kotlin在语言级别支持它,不需要任何样板代码。Kotlin可以使用by关键字把子类所有公有成员都委托给指定对象来实现基接口: ?...再介绍下如何将函数类型实例化,有几种常见方式: 一是使用函数字面值代码块,比如lambda 表达式 { a, b -> a + b },或者匿名函数fun(s: String): Int { return

1.4K40

Kotlin 极简教程 》第6章 泛型

本章我们来一起学习一下Kotlin泛型相关知识。 6.1.1 为什么要有类型参数 我们先来看下没有泛型之前,我们集合是怎样持有对象。 在Java中,Object是所有。...这种实现方式,存在问题有两个: 向集合中添加对象元素时候,没有对元素类型进行检查,也就是说,我们往集合中添加任意对象,编译器都不会报错。...但是不能调用setFirst方法,因为编译器无法确定参数类型。 通配符在类型系统中具有重要意义,它们为一个泛型所指定类型集合提供了一个有用类型范围。...extends Number>子类型,如果能将Float子类添加到List中,那么也能将Integer子类添加到List<?...Kotlin是一门支持面向对象编程(OOP)跟函数式编程(FP)强大语言。我们已经学习了Kotlin语言基础知识、类型系统、集合、泛型等相关知识了,相信您已经对Kotlin有了一个初步了解。

1.7K30

Kotlin】扩展函数总结 ★ ( 超扩展函数 | 私有扩展函数 | 泛型扩展函数 | 扩展属性 | 定义扩展文件 | infix 关键字用法 | 重命名扩展函数 | 标准库扩展函数 )

增加功能 ; Kotlin 中如果类 没有被 open 关键字修饰 , 则该类 不能被继承 , 如果想要扩展该类 , 可以使用 扩展函数 ; 扩展函数 可以作用于 自定义 , 也可以作用于 系统自带...---- 扩展函数 特点 是 为 父定义扩展函数 , 子类也可以调用该扩展函数 ; 为 Any 超 定义 扩展函数 , 那么 所有的 Any 子类 都可以 调用该 扩展函数 ; 一旦在 Any...该函数中涉及 两个泛型 T 和 R , 在 fun 关键字后声明 , 为 泛型 T 定义了一个扩展函数 let , 传入 (T) -> R 类型匿名函数 , 该 Lambda 表达式 返回 R 类型..., 此外还可以 给现有定义 扩展属性 ; 为现有定义 扩展属性 语法格式为 : val 现有名.扩展属性名: 扩展属性类型 get() = {} var 现有名.扩展属性名: 扩展属性类型..., 造成堆内存开销 ; 该函数中涉及 两个泛型 T 和 R , 在 fun 关键字后声明 , 为 泛型 T 定义了一个扩展函数 let , 传入 (T) -> R 类型匿名函数 , 该 Lambda

2.1K30

Kotlin学习日志(五)与对象

,但如果时Kotlin呢,代码冗余了, (1)属性字段跟构造函数入参,二者名称一样,变量类型也一样。...(2)初始化函数中属性字段赋值,为了区别同名属性和入参,特意给属性字段添加了this。 那么Kotlin如何精简这个代码呢?...Kotlin代码真的精简了很多,鸟枪换炮, 如果某个字段并非入参同名属性,就需要在内部显示声明该属性字段,例如,前面WildAnimal性别只是一个整型类型字段,而界面上展示是性别的中文名称...protected 只对自己和子类开放 private 只对自己开放、即私有 注意这几个修饰符与open一样都加在和函数前面,并且都包含“开放”意思,乍看起来还真有点迷,到底open跟这4个开放性修饰符是什么关系呢...通过一顿操作之后,总结出Kotlin继承与Java相比有所不同,主要体现在以下几点: (1)Kotlin默认不可被继承,若需继承,则要添加open声明,而Java默认是允许被继承,只有添加

1K20

Kotlin泛型型变之路

之前就写过一篇泛型文章,但是总觉得写得不够系统,所以最近对泛型又作了些研究,算是对这篇文章补充了。...所以,我们需要将这种检查前置编译期,这样在编写代码时,就可以安全使用不同类型,例如List,我们一看就知道是一个String类型list,不能放其他类型元素。...通配符表示这是一个未知类型 「super」下界通配符表示后面的这个类型,只能是它子类或者本身 这里不仅可以是,也可以适用于接口 其实这整个就是协变反向操作。...是Java子类,但是List和List却是两个无关,它们之间没有继承关系,而使用List<?...那么我们在实际代码中,要在哪些场景使用协变和逆变呢?通常来说,泛型参数协变后则表示——「这个参数在当前中,只能作为函数返回值,或者是只读属性」。

1.2K21

Kotlin入门(15)独门秘笈之特殊

上一篇文章介绍了Kotlin几种开放性修饰符,以及如何从基派生出子类,其中提到了被abstract修饰抽象。...因此,Kotlin摒弃了“枚举类型”那种模糊不清说法,转而采取“枚举”这种正本清源提法。具体编码上,则将enum作为关键字class修饰符,使之名正言顺地成为一个——枚举。...然而这些任务其实毫无技术含量可言,如果每天都在周而复始地敲实体相关编码,毫无疑问跟工地上搬砖民工差不多,活生生把程序员弄成一个拼时间拼体力职业。...见识了数据深厚功力,再来看看它代码是怎么定义: //数据必须有主构造函数,且至少有一个输入参数, //并且要声明与输入参数同名属性,即输入参数前面添加关键字val或者var, //数据不能是基也不能是子类...,如果没有属性字段,这个数据保存不了数据也就失去存在意义了; 2、主构造函数输入参数前面必须添加关键字val或者var,这保证每个入参都会自动声明同名属性字段; 3、数据有自己一套行事规则,

1.3K30
领券