- 継承:オブジェクト指向開発言語の概念であり、そのようなサブクラスは、追加のプロパティとメソッドを親クラスと属性とメソッドを継承する、または再定義することができます
- 別のカテゴリB「から継承された」カテゴリA、Aが「サブカテゴリーB」と呼ばれ、Bは「カテゴリAの父」と呼ばれて置くも、「AのBは、スーパークラスである」と呼ぶことができる場合
- 継承のアクションは:そのようサブカテゴリ同じコードを再記述することなく、様々な属性や親クラスのメソッドを有していてもよく、コードの再利用が効果的にすることができます
- サブカテゴリーではその親カテゴリ別の関数を得るために、あなたが特定の属性を再定義することができ、同時に、親クラスを継承し、いくつかのメソッド、プロパティと覆われている元の親カテゴリのメソッドをオーバーライド
- サブクラスはまた、サブクラス固有のフィールドやメソッドを定義することができ、親カテゴリを継承します
- 一般的な親クラスの属性とメソッドの定義(すべてのサブクラスに共通のものとして理解することができます)、それがメンバー(プロパティとメソッド)のより具体的なサブクラスを持っています
- 最終修正クラスが継承することはできません、最終的に変更されたフィールドやメソッドはカバーされません
継承のキーワード
拡張
- 使用すると、継承にキーワードを拡張します
- 文法を継承:クラスは、クラスBとして継承
- クラスA、クラスB、クラス{}クラスは、A、Bは、親クラスであることを特徴とする請求サブクラスで延びています
クラス人{ プライベートヴァル名=「Weiking」 DEFのgetName = 名前 } クラスの学生は、拡張人を{ DEF getAge = 26 } オブジェクトテスト{ DEFメイン(引数:配列[文字列]):単位 = { ヴァルSTU = 新しい学生 printf(stu.getName、stu.getAge) } }
オーバーライドとスーパー
- オーバーライド:親クラスのメンバ(フィールドやメソッド)をカバーする非抽象サブクラスは、overrideキーワードを使用する必要があります。
- スーパー:サブクラスがスーパークラスのメソッドをオーバーライドした後、superキーワードを使用するために、親クラスのメソッドが覆われているコールに、明示的ではない親クラスのスーパーフィールドを呼び出すことによって、親クラスと呼ばれる方法を指定します
クラスPERSON1 { ヴァル年齢 = 48 DEFのgetName = "Weiking" } クラス STUDENT1は延びPERSON1を{ ヴァル年齢オーバーライド = 20 オーバーライドDEFのgetName =「ジャック」 // 親クラスのメソッドをオーバーライド DEF ParentMember =のprintln(「私の父の名前は」+ スーパー .getName、「私の父は今年、」+ スーパー .age) // スーパーコールメソッドのgetNameの親クラスが親クラスのフィールド年齢はエラーになります呼び出すことができ デフselfMember =のprintln(+「私は」、+のgetName「私の名前は」年齢) } オブジェクトテスト{ DEFメイン(引数:配列[文字列]):単位 = { ヴァルSTU = 新しいSTUDENT1 stu.ParentMember // エラー:(19、73)スーパー値の年齢では使用できないことがあり stu.selfMember } }
上向きの遷移とデータ型のダウンキャスト
- 問題解決:オブジェクトのサブクラスを作成しますが、親クラスのタイプを与え、あなたは親クラス型を変換する必要があることは、サブクラスの種類です
- 変換サブクラスは、直接の親クラスを変換することができ、サブクラスに親クラスがサブクラスかどうかを判断する必要があります。
isInstanceOf和asInstanceOf
- isInStanceOf:オブジェクトが指定されたクラスのオブジェクトであるかどうかを決定します
- 使用方法:オブジェクト名.isInStanceOf [Lクラス名]
-
person.isInstanceOf [人]
- asInstanceOf:指定されたオブジェクト・タイプに変換
- オブジェクト名.asInstanceOf [Lクラス名]
-
person.asInstanceOf [学生]
クラス人{} クラスの生徒が延び}人の{ オブジェクトテスト{ DEFメイン(引数:配列[文字列]):単位 = { ヴァル人 = 新しい学生 println(person.isInstanceOf [人]) println(person.isInstanceOf [学生]) もし(person.isInstanceOf [学生]){ ヴァルSTU = person.asInstanceOf [学生] }
注1:isInstanceOf新バージョンでは、使用パターンマッチングを廃止されました
注2:オブジェクトがnullの場合、isInstanceOfはfalseを返す必要があり、asInstanceOfはnullを返す必要があります。
クラス人{} クラスの生徒が延び}人の{ オブジェクトテスト{ DEFメイン(引数:配列[文字列]):単位 = { ヴァル・P:人 = 新しい学生 sであった学生 = ゼロ println(p.isInstanceOf [学生]) println(s.isInstanceOf [学生]) println(s.asInstanceOf [学生]) } }
パターンマッチング
- 同じ機能上及びisInstanceOf関数をパターンマッチングが、使いやすいです
クラス人{} クラスの学生延び人{} クラス教師延び}人の{ オブジェクトテスト{ DEFメイン(引数:配列[文字列]):単位 = { ヴァル・P:人 = 新しい学生 Pマッチ{ ケース PE:教師=> printlnを( "Personオブジェクト" ) ケース STU:学生=> printlnを( "学生オブジェクト" ) } } }
GetClass与classof
- GetClass:正確にクラスのオブジェクトを取得することができます
- classOf:正確にクラスを取得することができます
クラス人{} クラスの生徒が延び}人の{ オブジェクトテスト{ DEFメイン(引数:配列[文字列]):単位 = { ヴァル・人:人 = 新しい学生 ヴァルOB:クラス[_ <:人] = person.getClass ヴァルCLA:クラス[学生] = classOf [学生] の場合(person.getClass == classOf [人])のprintln( "真")他のprintln( "偽" ) の場合(person.getClass == classOf [学生])のprintln ( "真")他のprintln( "偽" ) の場合(1.getClass == classOf [INT])のprintln( "真")他のprintln( "偽" ) } }