Scalaの継承オブジェクト指向プログラミング

拡張キーワードを

 

//スカラ座、サブクラスは親クラスを継承し、なるようにJavaの使用であることと、拡張キーワードを

// 継承サブクラスは、親クラスから親クラスの継承表すフィールドメソッドを、サブクラスは、親クラス内に配置することができる独自の内部、サブクラス特定持たないフィールドメソッド、コード再利用の継承の有効活用

// サブクラスは親クラスオーバーライドすることができフィールドおよびメソッドを持つ親ただし、; 最終修正、フィールドおよびメソッドを持つ最終的な修飾は、クラスが継承することができない、フィールドおよび方法がカバーされていないが

 

クラスPerson {

  プライベートVAR名=「レオ」

  DEFのgetName =名前

}

クラスの学生は、{人を拡張します

  プライベートVARスコア= "A"

  DEF getScore =スコア

}

 

オーバーライドスーパー

Scalaは// 、サブクラスは親クラスの非抽象メソッドをカバーするために、あなたが使用する必要がありますオーバーライドキーワードを

//オーバーライド:キーワードは、私たちは早くも、そのような可能な限りコードの誤りを見つけるのを助けることができるオーバーライドなど親クラスのメソッドなどのパラメータが間違っている私たちを上書きする;など私たちはスペルミスメソッド名変更親クラスのメソッド

// また、サブクラスの後に我々は、サブクラスのメソッドである場合、親クラスがそれによって覆われて呼び出すことです、親クラスのメソッドをオーバーライドしますか?それは使用することができ、超親クラスを呼び出すために、明示的にメソッドを指定し、キーワードを

 

クラスPerson {

  プライベートVAR名=「レオ」

  DEFのgetName =名前

}

クラスの学生は、{人を拡張します

  プライベートVARスコア= "A"

  DEF getScore =スコア

  getName DEFオーバーライド= + super.getName "こんにちは、私は"

}

 

オーバーライド・フィールド

//スカラ座、サブクラスは親クラスのオーバーライドすることができvalのフィールドを、およびサブクラスのvalフィールドも親クラスカバーすることができるのvalフィールドゲッターメソッドを、単にサブクラスで使用オーバーライドするキーワード

 

クラスPerson {

  ヴァル名:文字列=「人」

  DEF年齢ます。int = 0

}

 

クラスの学生は、{人を拡張します

  valの名前を上書き:文字列=「レオ」

  valの年齢をオーバーライドします。int = 30

}

 

isInstanceOf asInstanceOf

 

// 私たちはオブジェクトのサブクラスを作成しますが、今度は親クラスの型の変数を与える場合。フォローアッププログラムでは、我々は何をすべき、親クラスは、変数の変数型のタイプのサブクラスで変換する必要がありますか?

// まず、使用isInstanceOfは、指定されたオブジェクトが、オブジェクトクラスであるか否かを判断し、もしそうであれば、使用することができるasInstanceOf 指定されたオブジェクト・タイプを変換します

// オブジェクトがある場合がありますnullの場合、isInstanceOfは返す必要があります、asInstanceOfは、返す必要がありますヌル

// あなたが使用していない場合がありますisInstanceOfを、第1の目的は、指定したクラスのインスタンスであるかどうかを判断するの直接使用asInstanceOfの変換を、あなたが例外をスローすることがあります

 

クラスPerson

クラスの学生は、人を拡張します

ヴァル・P:人=新しい学生

sであった学生=ゼロ

IF(p.isInstanceOf [学生])S = p.asInstanceOf [学生]

 

getClass classOf

// isInstanceOf それが唯一の指定されたオブジェクトは、オブジェクト・クラスおよびそのサブクラスであるが、正確に判定することができない、物体であると判定された場合に、指定されたクラス

// ターゲットを正確に指定されたクラスのオブジェクトを決定するために必要とされる場合には、それだけで使用することができますのgetClass classOf

// オブジェクト.getClassを正確に取得することができるオブジェクト・クラス、classOf [ クラスは正確クラスを取得することができ、その後== オペレータが決定することができます

 

クラスPerson

クラスの学生は、人を拡張します

ヴァル・P:人=新しい学生

p.isInstanceOf [人]

p.getClass == classOf [人]

p.getClass == classOf [学生]

 

 

パターンマッチング方式の判断を使用します

// しかし、などの実際の開発にスパーク源、場所の多くは、はるかに簡潔な方法であるタイプを決定するパターンマッチング方法を実行するために使用され、コードもスケーラビリティと保守性を得ること非常に高いです

// 使用パターンマッチング、機能、およびのためのisInstanceOf このクラスのクラスとサブクラスをターゲット主に決定されるのが好き正確に判断できません

 

クラスPerson

クラスの学生は、人を拡張します

ヴァル・P:人=新しい学生

 

Pマッチ{

  あたりの場合:人=> printlnを(「それは人の物です」)

  ケース_ => printlnを( "不明タイプ")

}

 

保護されました

// Javaの、とScalaの使用でも可能な保護されたキーワードを修正するためにフィールドメソッドをサブクラスがする必要がないように、スーパーキーワード、あなたが直接アクセスできるフィールドメソッドを

// あなたが使用することもでき、[この]を保護し、あなただけの現在のサブクラスのオブジェクトに親クラスにアクセスすることができ、フィールドメソッド、他のサブクラスのオブジェクトの親クラスによってアクセスすることができない、フィールドメソッド

 

クラスPerson {

  保護されたVAR名:文字列=「レオ」

  保護された[この]のvar趣味:文字列=「ゲーム」

}

クラスの学生は、{人を拡張します

  DEFのsayHello =のprintln( "こんにちは、" +名)

  DEF makeFriends(S:学生){

    println( "あなたの趣味は、" +趣味+ "私の趣味は" + s.hobby)

  }

}

親クラスの呼び出しコンストラクタを

// Scalaは、各クラスは、プライマリ有することができ、コンストラクタ及び補助任意の複数のコンストラクタを、各補助コンストラクタ最初の行の他の補助によって呼び出されなければならないコンストラクタまたはプライマリコンストラクタ;従ってヘルパークラスコンストラクタは確かではありませんあなたは直接の親クラスを呼び出すことがコンストラクタのを

// 唯一の主要なサブクラスのコンストラクタは、親クラスの呼び出しコンストラクタを、この構文は、サブクラスの主なコンストラクタを介して親クラスのコンストラクタを呼び出すことです

// 注意してください!親クラスのようなパラメータを、受信された場合は名前年齢サブクラスは、受け取るために、任意の使用していない、ヴァルVARを変更すると、それ以外の場合は、サブクラスが考慮されますが、親クラスよりも優先されますフィールドを

クラスPerson(ヴァル名:文字列、ヴァル年齢:INT)

クラスの学生(名:文字列、年齢:INT、VARスコア:ダブル){人(名前、年齢)を拡張します

  {この(文字列名)DEF

    この(名前、0、0)

  }

  デフこの(年齢:INT){

    この( "レオ"、年齢、0)

  }

}

 

 

匿名内部クラス

// Scalaの、匿名のサブクラスでは非常に一般的な、そして非常に強力です。スパークソースコードも、この匿名のサブクラスの広範な使用です。

// 匿名のサブクラスは、それはあなたには、クラス名のサブクラスを定義して、直接変数にそのオブジェクトとオブジェクト参照を作成することはできません、と言うことです。オブジェクトの後であっても、他の機能への匿名のサブクラスを渡すことができます。

 

クラスPerson(保護ヴァル名:文字列){

  DEFのsayHello = "こんにちは、私は" +名

}

ヴァル・P =新しい人物( "レオ"){

  DEFのsayHello =「こんにちは、私は」+名を上書き

}

DEFグリーティング(P:人{DEFのsayHello:文字列}){

  println(p.sayHello)

}

 

抽象クラス

// 親クラスならば、そこに特定の方法がすぐに実現することができないですが、自分自身のさまざまな方法を達成するために書き換えられ、カバーするために別の子に依存する必要があります。このとき、親クラスがこれらのメソッドは、唯一のメソッドシグネチャを特定の実装を与えていないかもしれ、このメソッドは抽象メソッドです。

// クラスが抽象メソッドを持っている場合は、そのタイプが使用されなければならない抽象は抽象クラスとして宣言することは、抽象クラスはインスタンス化し、この時点では不可能です

// サブクラスでオーバーライド抽象クラスの抽象メソッドを使用する必要はないオーバーライドキーワード

 

抽象クラスPerson(ヴァル名:文字列){

  DEFのsayHello:ユニット

}

クラスの学生(名:文字列)人(名前を){拡張します

  DEFのsayHello:単位=のprintln( "こんにちは、" +名)

}

 

 

抽象フィールド

// 親クラスが定義されている場合は、フィールドをが、初期値を与えていない、このフィールド抽象フィールド

// 抽象フィールドの手段、Scalaはとして、独自のルールに従っただろうVAR のval のタイプフィールドの対応を生成するためにゲッターセッターメソッドを、しかし、親クラスではありません、フィールド

// サブクラスがオーバーライドする必要がありますフィールドは、独自の具体的な定義するために、フィールドを、抽象カバーフィールドを使用する必要はありませんオーバーライドキーワードを

 

抽象クラスPerson {

  ヴァル名:文字列

}

 

クラスの学生は、{人を拡張します

  ヴァル名:文字列=「レオ」

}

おすすめ

転載: www.cnblogs.com/YuanWeiBlogger/p/11432419.html