関数オブジェクト(Scala)
2875 ワード
関数オブジェクト
Rationalクラスを例に、クラスパラメータ、構築方法、メソッド、オペレータ、プライベートメンバー、書き換え、事前条件チェック、リロード、および自己参照について説明します.
可変オブジェクトと可変オブジェクトの違い
可変オブジェクトは通常、可変オブジェクトよりも推理しやすく、時間の変化に伴って変化せず、複雑な状態空間はありません.次に、可変オブジェクトを自由に渡すことができます.可変オブジェクトの場合、転送する前に保護的なコピーが必要です.可変オブジェクトは、ハッシュ・テーブルのキーとして安全に使用できます.劣勢は、可変オブジェクトには大きなオブジェクト図が必要です.
構築Rationalクラス
Javaとは異なり、クラスはパラメータを受信できることがわかります.Javaでは構築方法があり,構築方法はパラメータを受信する.
書き換え実装toStringメソッド
RationalクラスにtoStringメソッドを追加することで、デフォルトのインプリメンテーションを書き換えることができます.
事前条件の確認
可変オブジェクトの場合は、構築時にオブジェクトが正当であることを確認します.例えば有理数は0に分母できない.入力パラメータdが0の場合、オブジェクトの生成は禁止されるべきである.この問題を解決するには,主構造法に対して前置条件を定義する.
requireメソッドはbooleanパラメータを受信し、trueに入力し、正常に戻り、falseに入力し、IllegalArgumentException異常を飛び出します.
フィールドの追加
別のRationalクラスを受信するaddメソッドを定義し、可変特性を維持するために、addメソッドはこの2つのRationalクラスの和に等しい別のRationalクラスを作成する必要があります.
thatは使用できません.nとthat.dは実現する.thatの分子と分母にアクセスするには、フィールドにします.
構築方法
クラスは複数の構築方法を定義します.Scalaでは,主構造法以外の構造法を補助構造法と呼ぶ.例えばRationalクラスは1つのパラメータ,すなわち分子のみを受信する.分母は1として予め定義する.
プライベートフィールドとメソッド
例えばRational類を正規化し,分子と分母を最大公約数で割る.
オペレータの定義
x.add(y)をx+yに変換します.
メソッドの再ロード
+を例にとると、右操作元は、有理数であるか整数であるかのいずれかである.
Rationalクラスを例に、クラスパラメータ、構築方法、メソッド、オペレータ、プライベートメンバー、書き換え、事前条件チェック、リロード、および自己参照について説明します.
可変オブジェクトと可変オブジェクトの違い
可変オブジェクトは通常、可変オブジェクトよりも推理しやすく、時間の変化に伴って変化せず、複雑な状態空間はありません.次に、可変オブジェクトを自由に渡すことができます.可変オブジェクトの場合、転送する前に保護的なコピーが必要です.可変オブジェクトは、ハッシュ・テーブルのキーとして安全に使用できます.劣勢は、可変オブジェクトには大きなオブジェクト図が必要です.
構築Rationalクラス
class Rational(n : Int, d : Int)
Javaとは異なり、クラスはパラメータを受信できることがわかります.Javaでは構築方法があり,構築方法はパラメータを受信する.
書き換え実装toStringメソッド
RationalクラスにtoStringメソッドを追加することで、デフォルトのインプリメンテーションを書き換えることができます.
class Rational(n:Int,d:ing) {
override def toString = n + "/" + d
}
事前条件の確認
可変オブジェクトの場合は、構築時にオブジェクトが正当であることを確認します.例えば有理数は0に分母できない.入力パラメータdが0の場合、オブジェクトの生成は禁止されるべきである.この問題を解決するには,主構造法に対して前置条件を定義する.
class Rational (n : Int, d : Int) {
required(d != 0)
override def toString = n + "/" + d
}
requireメソッドはbooleanパラメータを受信し、trueに入力し、正常に戻り、falseに入力し、IllegalArgumentException異常を飛び出します.
フィールドの追加
別のRationalクラスを受信するaddメソッドを定義し、可変特性を維持するために、addメソッドはこの2つのRationalクラスの和に等しい別のRationalクラスを作成する必要があります.
class Rational (n : Int, d : Int) {
required(d != 0)
val numer:Int = n
val denom:Int = d
override def toString = n + "/" + d
def add(that : Rational) : Rational =
new Rational(
numer * that.denom + that.numer * denom,
denom * that.denom
)
}
thatは使用できません.nとthat.dは実現する.thatの分子と分母にアクセスするには、フィールドにします.
構築方法
クラスは複数の構築方法を定義します.Scalaでは,主構造法以外の構造法を補助構造法と呼ぶ.例えばRationalクラスは1つのパラメータ,すなわち分子のみを受信する.分母は1として予め定義する.
// this, 。
def this(n:Int) = this(n,1)
プライベートフィールドとメソッド
例えばRational類を正規化し,分子と分母を最大公約数で割る.
class Rational (n : Int, d : Int) {
required(d != 0)
private val g = gcd(n.abs, d.abs)
val numer:Int = n / g
val denom:Int = d / g
def this(n:Int) = this(n,1)
override def toString = n + "/" + d
def add(that : Rational) : Rational =
new Rational(
numer * that.denom + that.numer * denom,
denom * that.denom
)
private def gcd(a:Int, b:Int) : Int =
if (b==0) a else gcd(b, a % b)
}
オペレータの定義
x.add(y)をx+yに変換します.
//
def + (that: Rational):Rational =
new Rational(
numer * that.denom + that.numer * denom,
denom * that.denom
)
//
def * (that: Rational):Rational =
new Rational(
numer * that.numer,
denom * that.denom
)
メソッドの再ロード
+を例にとると、右操作元は、有理数であるか整数であるかのいずれかである.
def + (that: Rational):Rational =
new Rational(
numer * that.denom + that.numer * denom,
denom * that.denom
)
def + (i: Int) =
new Rational(numer + i * denom, denom)