1.抽象クラス
(1)コンセプト
それによって任意のサブクラスの設計を回避する、抽象テンプレートのサブクラスとしてクラスに抽象クラスを使用して、抽象変形の同じ特性を持つ複数のクラスから。デザインは、抽象クラスであるテンプレートパターンデザインパターン。
(2)特徴
抽象クラス、抽象プロパティは、抽象的でオープンな修飾子は共存できない、抽象メソッド修飾子を開く必要はありません。
抽象クラスをインスタンス化することはできませんが、この方法は、構造を有し、サブクラスのコンストラクタが使用されています。
抽象クラスは含まれていてもよい:プロパティ(抽象的または非抽象属性プロパティ)、方法(または抽象非抽象メソッドの方法)、コンストラクタ、初期化ブロック、ネストされたクラス(インタフェース、列挙)5人のメンバーを。
- (直接の定義を含む抽象メンバー、または抽象スーパークラスを継承しますが、完全に親クラスが抽象メンバーが含まれている、またはインタフェースを実装して実現していないが、完全に抽象インタフェースは、すべての3例のメンバーが含まれて実装されていません)抽象メンバーが含まれていますのみこれは抽象クラスとして定義することができます。
抽象ローカル変数を変更することはできません。
(3)抽象のメンバー(抽象メソッド、抽象的特性)
メソッドとプロパティで抽象クラスを使用して抽象修正。
抽象メソッドは、メソッド本体を持つことはできません。
抽象属性初期化が必要とされていません。
(4)抽象クラスを定義
ここでは抽象クラスメソッドの定義は、
/**
* 定义一个抽象类
*/
abstract class AbstractClass {
//抽象属性,不能初始化
abstract var abstractParam : String
//抽象方法,不能有方法体
abstract fun abstractFun()
//普通属性,子类也可以重写,但是需要open修饰
var commonParam : Int = 1
//普通方法,子类也可以重写,但是需要open修饰
fun commonFun() {
//方法执行体
}
constructor() {
//构造器,也可以在定义类时定义主构造器,抽象类的构造器是给子类用的,抽象类本身不能实例化
}
}
以下は、抽象クラスを継承するサブクラスの例であります
fun main(args: Array<String>) {
val fruit1 = Orange("橙子")
val fruit2 = Apple()
fruit1.eat()
fruit2.eat()
}
/**
* 水果抽象类
*/
abstract class Fruit {
fun eat() {
println("吃水果:$fruitName ,获取的水果重量${getFruitWeight()}")
}
abstract val fruitName : String
abstract fun getFruitWeight() : Int
}
/**
* 橘子子类
*/
class Orange(override val fruitName: String) : Fruit() {
override fun getFruitWeight(): Int {
return 10
}
}
/**
* 苹果子类
*/
class Apple : Fruit() {
override fun getFruitWeight(): Int {
return 20
}
override val fruitName: String
get() = "苹果"
}
2.密封されたクラス(特別な抽象クラス)
(1)コンセプト
シールは、サブクラス化するように設計され、特別なクラス抽象クラスです。密封された修飾子の使用が変更されました。
(2)特徴
サブクラスで密封されたクラスが固定されています。
次の理由の場合:
- サブクラスはシール付きクラスのクラスファイルで封止されている必要があります。
- 他のファイルでは、クラスのサブクラスで封止することができません(サブクラス密封されたクラスを継承したが、他のタイプでもよいです)。
(3)シールされたクラスを定義します
/**
* 密封类
*/
sealed class SealedClass {
abstract fun sealedFun()
}
/**
* 密封类子类1
*/
class SubClass1 : SealedClass() {
override fun sealedFun() {
}
}
/**
* 密封类子类2(使用open修饰,可以在其他文件派生子类)
*/
open class SubClass2 : SealedClass() {
override fun sealedFun() {
}
}
3.インタフェース
(1)コンセプト
インタフェースは、外の世界に提供する必要があります達成するためのサービス(メソッド、プロパティ)を定義外窓や仕様、と対話するシステムを定義します。
(2)特徴
- 修飾子:公共|内部|プライベートまたは省略(つまり、国民は省略)。
- インタフェースは、クラスを継承していない、インターフェイスを継承することができます。
- 抽象インタフェース定義/非抽象メソッド。
- インターフェイスは、抽象プロパティ/非抽象プロパティを定義することができますが、インターフェイスは、抽象プロパティ料フィールド(出願)の後ろにないので、GET-setメソッドとそれらを提供する必要があります。
- kotlinインタフェース非抽象メンバー(メソッド、プロパティ)は、公開使用することができます|プライベートの2頭のアクセス権の変更を(自動的にアクセス権を指定した場合、パブリックインターフェイス部材を提供するように変更Javaは唯一の公共可能)、メンバーは唯一の公共抽象を使用することができます修正;
- インタフェースはコンストラクタと初期化ブロックが含まれていないが、インターフェイスが含まれることがある:方法(抽象メソッド/非抽象メソッド)、プロパティ(抽象プロパティは/非抽象属性)、ネストされたクラス(インターフェイスまたはネストされた、ネストされた列挙)。
- kotlinインタフェースは、抽象キーワード部材(抽象メンバー抽象クラスを省略することができない)を省略することができる抽象化します。
- インタフェースは、インスタンス化できないが、(サブクラスオブジェクトインタフェース必要のサブクラスであるため、上方遷移)変数どれによって割り当てられる変数を宣言するために使用することができます。
- インタフェースを実装する抽象実装クラスでは唯一の公共インタフェースの変更のメンバーになることができます。
(3)インタフェースを定義
fun main(args: Array<String>) {
val person: Human = People("男", 5, 10)
person.speak()
(person as? Child)?.howOldAreYou()//向下转型为Child类型
println("年级:${(person as? Student)?.grade}")//向下转型为Student类型
val any : Any = person//person可以直接赋给Any
}
/**
* 定义一个人类接口
*/
interface Human {
//抽象属性,可省略abstract关键字,var type : String,只能使用public修饰
abstract var type: String
//非抽象属性,可以使用public|private访问权限符修饰
val sex: String
get() = type
//非抽象方法,可以使用public|private访问权限符修饰
fun speak() {
if (canSpeak()) println("我是${sex}的") else println("不会说话")
}
//抽象方法,可省略abstract关键字,fun canSpeak() : Boolean
abstract fun canSpeak(): Boolean
}
/**
* 定义一个学生接口
*/
interface Student {
val grade: Int
}
/**
* 定义一个小孩抽象类
*/
abstract class Child {
//抽象类的抽象属性,abstract不能省略
abstract val age: Int
//抽象类的费抽象方法(有方法体)
fun howOldAreYou() {
println("年龄:$age")
}
}
/**
* 定义Person类,继承于Child抽象类,实现了Student接口、Human接口,类后面的抽象类只能有一个,接口可以有多个,摆放顺序随意
*/
class People(override var type: String, override val grade: Int, override val age: Int) : Child(), Student, Human {
override fun canSpeak(): Boolean {
return true
}
}