ハードウェアの気になるあれこれスマートフォン用の表示で見るハードウェアの気になるあれこれ技術的に興味のあることを調べて書いてくブログ。クラスScalaスポンサーリンク今日はクラスの章を。記法を除けばJavaのクラスと同等らしい。(Javaはよくわかってない)構文は以下の通り。)*}例えば点を示すクラスPointはScalaでは以下のようになる。_y}うん、なんとなくはわかる。上記の定義そのものがコンストラクタになっている感じか。使うときは、こんな感じでよさそう。}}実行結果はエラーはなく、以下のようになった。Main$Point@16b3fc9e1002以下のようにして、コンストラクタの引数にval/varをつけて定義すると、その引数はそのまま公開フィールドになるとのこと。{}Scalaでは複数のコンストラクタを定義することは出来るが、基本的には1つのコンストラクタのみを使って複数の精製方法を定義する場合にはapplyメソッドを使うことが多い。この1つのコンストラクタはプライマリコンストラクタとして、特別に扱われる。e.あんまりいい例ではないけど、こんな感じ↓。2つめのコンストラクタ}プライマリコンストラクタの引数のスコープはクラス定義全体に及ぶので、以下のようにメソッド定義の中からコンストラクタ引数を参照できる。")"}なんかいろいろまだ見たこと無いのがいっぱい。toString()はString型への変換メソッドをオーバーライドしてるということはもともとのクラスにはtoString()メソッドがあるということか。pythonのobjectみたく大本から派生してるものだと推測。メソッド定義すでに上記の例でメソッドを定義しているが一般形は以下のような形になる。<本体><本体>の部分は通常はブロック式になる。パッケージ名]のthisやパッケージ名でスコープを限定できるprivateのみの場合:同一クラスからのみアクセス可能protectedののみの場合:派生クラスからのアクセスも可能[this]をつけた場合:同じオブジェクトからのみアクセス可能[パッケージ名]をつけた場合:同一パッケージに所属している場合もアクセス可能この辺のスコープの話はまたあとで確認が必要そう。<本体式>資料のサンプルを動かしてみる。}}うーーむ、なんとも不思議な定義&呼び出しだ。実行してみると、以下のようにエラーはなく動作する。parameterのために必要になったり、型推論を補助するために使われたりといった用途があります。ことだが、このサンプルだけではいまいち便利さが理解できない。そのうちわかるのだろうか。以下のようにすることで、最初の引数は適用済みの状態にして新しい関数にすることも出来る(部分適用というらしい)。}}なるほど、こうすることで特定のデータを適用済みの状態を作り出せるのか。match式とかと組み合わせると面白そうな気配。ちなみに、通常通りに1つの引数リストに複数の引数を定義しておき同様に部分適用した状態を作ることも可能。なんかad4の定義が面倒になってるな。他のケースと同様に変更可能かどうかprivate/protected:メソッドの定義と同様private[this]をつけるとJVMレベルでのフィールドへの直接アクセスになるので若干高速になるらしい。抽象メンバーも定義できる。要は本体を書かなければいいみたい。<返り値型>次にフィールド。こちらもメソッドと感覚的には一緒で、初期化をしなければいい。<フィールド型>なお、抽象メンバーを持ったクラスを定義する際には抽象クラスとして宣言するためにabstract修飾子が必要になる。いうことでまとめると、以下のようになるはず。抽象メソッド}前項で出てきたAdderを抽象クラスにしてみる。}}抽象クラスなのでインスタンス使用しようとするとエラーになる。この辺はC++とかと一緒。前項で抽象クラスが出てきたが、他の限度と同様にインスタンス出来ないという挙動だった。いうことで次は継承についてが出てくる。継承の目的は以下の2つスーパークラスの実装をサブクラスでも使用することにより実装を再利用する複数のサブクラスがスーパークラスのインターフェースを継承することで処理を共通化する継承は以下のような構文。<メソッド定義>)*}extendsが継承のキーワード。Verilogと一緒か。その後に付いているトレイトを使うことで複数の実装を継承することが可能とのことだが、こちらはドワンゴの資料で別で1章解説があるのでその時に確認することにする。先ほど作成した抽象クラスBaseAdderを継承してインスタンス可能なクラスAdderを作る。}}上記のように継承して作成したSubAdderはインスタンス可能になり、以下のように加算された結果が得られる。300次は抽象クラスではないクラスを継承してメソッドをオーバーライドしてみる。}}上記を実行してみると、WrongAdderの方ではthis.xに50を入れており、addメソッドでthis.xが加算される仕組みになっているため値が350になって返ってくる。./20180909_04_class_derived.scala350なお先の抽象クラスBaseAdderの例とは異なり、今回のBaseAdderクラスでは既にaddメソッドが実装されているため、SubAdderクラスのadd関数の宣言に付いているoverrideを外すとエラーになる。クラスを定義してください。クラスは次のようにして使うことができなければいけません。102030これでClassの章はおしまい。一通り終わってからスコープの件はもう少し突っ込んで確認してみよう。技書博2にChisel本を出してきました月別アーカイブはてなブログをはじめよう!diningyo-kpuku-jougekiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。