だから私はScala for the Impatient の本を読んでいて、それが使用する例の 1 つは、本質的に何らかのストリームにLogger
a を出力する特性です。この例では、メッセージを出力String
する特性ConsoleLogger
( extends )と( extends も拡張) があり、長さが長すぎる場合は単純に文字列を切り捨てます。本の最大長を変更するには、次のような匿名サブクラスを使用することを提案します。Logger
stdout
ShortLogger
Logger
ShortLogger
val acct = new SavingsAccount with ConsoleLogger with ShortLogger {
val maxLength = 20
}
whereは抽象フィールドをShortLogger
持つ特性であり、次のように定義されますmaxLength: Int
SavingsAccount
class SavingsAccount extends Account with Logged { ... }
これは私には理にかなっています(一種の)。私は構築順序が次のとおりであると仮定しています。
Logger
最初に構築されます (これは のスーパートレイトであるためConsoleLogger
)、ConsoleLogger
ShortLogger
Account
SavingsAccount
.- 次に、abstract を定義する無名サブクラスの構築があります
maxLength = 20
。
ただし、本の後半では、新しいLogger
サブ特性を提供します。
trait FileLogger extends Logger {
val filename: String
val out = new PrintStream(filename)
def log(msg: String) { out.println(msg); out.flush() }
}
val acct = new SavingsAccont with FileLogger {
val filename = "myapp.log" // Does not work
}
工事順で動かないとのこと。彼らは修正を提案します:
val acct = new {
val filename: "myapp.log"
} with SavingsAccount with FileLogger
ただし、この定義は上記の と似ているmaxLength
ようですが、上の例と下の例の間に何が欠けているのでしょうか?