Programming in Scale 2 nd読書ノート3

5439 ワード

Composition and Inheritance
クラスまたは抽象クラスを継承する場合の書き換え方法にoverrideキーを付ける必要があります
traitを実現する方法は必要ありません
class宣言時に直接()にvalタグパラメータを使用すると、対応するフィールドを直接生成してアクセスできます.
パラメータなしの方法

class A{
 def method1={

 }
 def method2()={

 }
}

method 1はパラメータなしの方法です
呼び出し時に直接objA.method 1でよい
objA.method 1()アクセス
method 2はobjAを通過するしかない.method 2()アクセス
上の例ではmethod 1()のメソッドを宣言することはできません
パラメータなしmehtodとfieldは同じネーミングスペースを共有します
いけません
class A{
val a=0;
def a={
}
}
val aとdef aの違いは
val aの値はメモリに直接存在し、def aは呼び出すたびに実行され、具体的なニーズを見て選択されます.
継承時に親がdef aの子クラスをoverride val a=xxxと書く逆も同様である
classについてこれとclassmethod()書き方の違い
メソッド呼び出しにside-effectがない、すなわちオブジェクトの状態が変化せず、毎回の戻り値が同じである場合にclassを使用することを提案する.method,逆に状態を変えてclassを使う.method()
注意:printとprintlnメソッドは()を持っていくべきで、彼らはConsoleの状態を変えました.
子クラス親クラスの構築方法を使用してextendsの後に示す
finalキーワードとjava
具体的に実装されたサブクラスを工場クラスにシールドする
工場としてCompanion Objectを介して、特定のタイプを返し、clientにサブクラスをマスクします.
Scala’s Hierarchy
Anyはすべてのクラスのルートです
いくつかの基本的な方法を宣言した.
final def ==(that: Any): Boolean
final def !=(that: Any): Boolean
def equals(that: Any): Boolean
def##: Int
def hashCode: Int
def toString: String
基本的なInt,Long,DoubleなどはAnyValから継承されている
すべての一般クラスはAnyRefから継承され、AnyRefはjavaに相当する.lang.Objectの別名
NullとNothingはすべてのタイプのサブクラスです
Nothingは、必ず例外を投げ出す方法の戻り値に使用します.
Trait
Javaのinterfaceのように使用できます
すべての方法は実現されず、traitはjavaのinterfaceに直接コンパイルされます.
traitは、コード再利用の基本ユニットとして、traitを多く継承したり、宣言したりすることができますが、newはできません.
scalaにはOrdered traitがあり、中にはすべての><=>=などの方法が実現されています.
自分で実装したクラスを比較する必要がある場合は、Orderedを継承し、そのcomparareメソッド(javaのComparable.comparareと値を返す)を実装するだけで、これらの><などのメソッドを使用できます.
Traits as stackable modifications
traitによって実現されるチェーン式の装飾器モードと理解できる
class A extends B with TraitA with TraitB
Bはclassでなければなりません
A B TraitA TraitBのいずれかのメソッドが宣言され実現された場合、
付加操作後にsuperを呼び出すように実現する.method(...)
呼び出す順番はA TraitB TraitA B
extends後に宣言された順序とは逆です
Aに声明がなければTraitB TraitA Bです
次の構造について

class Animal
trait Furry extends Animal
trait HasLegs extends Animal
trait FourLegged extends HasLegs
class Cat extends Animal with Furry with FourLegged

Catクラスでは呼び出し順は
Cat-FourLegged-HasLegs-Furry-Animal(後ろにAnyRef,Any)
また、Traitにメソッド実装が含まれている場合、Traitを変更するには、そのTraitのすべてのサブクラスを再コンパイルする必要があります.
だからlibとしてリリースするクラスについては、Traitを慎重に使用し、Traitを変更すると、すべてのclientのコードが再コンパイルされます.
Packages and Imports
Javaの方法でpackageを宣言することができます.
以下のようにしてもよい

package bobsrockets {
  package navigation {
    // In package bobsrockets.navigation
    class Navigator
    package tests {
      // In package bobsrockets.navigation.tests
      class NavigatorSuite
    }
  }
}

コンパイラは自動的に処理し、コンパイルしたclassを対応するフォルダに配置します.
上で宣言したpackageとオブジェクトについて
NavigatorSuiteでは上位パッケージのNavigatorに直接アクセスできます
ただし、別のファイルに分割するとアクセスできません
同じレベルの他のパッケージのクラスにアクセスすると、簡単に書くことができます.
例えばパケット構造a.b.c.d.e.f.g
パケットdの下にクラスDがあり、パケットgの下にクラスGがある
Dの中で直接e.f.g.Gでアクセスすることができて、a.b.cを必要としません
GはDにアクセスし、指示が必要である
_root_ルートを表すパッケージ
import package._
import package
new package.Class
メソッドボディにimportのクラスやパッケージを入れることもできます
別名#ベツメイ#
import java.sql.{Date => SDate}
あとはSDateでしかjavaにアクセスできません.sql.Date
import Fruits.{Apple => McIntosh, _}
すべてのFruitsの下のクラスをロードしますが、AppleはMcIntoshに名前を変更しました.
import Fruits.{Apple => _, _}
すべてのFruitsの下のクラスをロードするにはAppleを除いて、最初の_
scalaはデフォルトで3つのパッケージをロードします
import java.lang._//everything in the java.lang package
import scala._//everything in the scala package
import Predef._
access modifiers
scalaにprivateとprotectedしかないと自動的にpublicとみなされます
protectedとjava
privateとjavaのprivateは少し違います
クラスのフィールドはprivateでjavaではこのクラスの内部クラスにアクセスできます
scalaはアクセスできませんが、逆に可能です.

class Outer {
	class Inner {
		private def f() { println("f") }
		class InnerMost {
			f() // OK
		}
	}
	(new Inner).f() // error: f is not accessible
}

private defをprivate[Outer]defと宣言するだけでOuterにアクセスできます.具体的には次のように説明します.

package bobsrockets
package navigation {
	private[bobsrockets] class Navigator {
		protected[navigation] def useStarChart() {}
		class LegOfJourney {
			private[Navigator] val distance = 100
		}
		private[this] var speed = 200
	}
}
package launch {
	import navigation._
	object Vehicle {
		private[launch] val guide = new Navigator
	}
}

Table 13.1 · Effects of private qualifiers on LegOfJourney.distance
no access modifier public access
private[bobsrockets] access within outer package
private[navigation] same as package visibility in Java
private[Navigator] same as private in Java
private[LegOfJourney] same as private in Scala
private[this] access only from same object
private[]の宣言はコンパイル後のバイトコードにpublicが含まれているため、いくつかの問題がある可能性があります.
また、内部クラスと外部クラスについてはこの章では紹介されていませんが、簡単に実験したのはjavaと同じはずです.
ただし、静的内部クラスはcompanion object、すなわち同名のobject宣言クラスに宣言する必要があります.