入門記3回目。クラス周りについて。
なんか.NET MAUIがRC公開を重ねてるけど非Preview版のVisual StudioでGAするのは22年後半らしいのでまだセーフ。あれ君22Q2にリリースって言ってなかったっけ?
パッケージとインポート
パッケージはC#でいう名前空間に相当するもの(のはず)。Kotlinでは1ファイルに複数パッケージを含めることができません。C# 10で導入されたFile Scoped Namespacesのイメージ。
namespace Sample; //何もつけないとpublicと同義 class Hoge { }
Kotlin
package com.example.sample //何もつけないとpublicと同義 class Hoge { }
インポートはC#でいうusingに相当するが、クラス名まで書く必要があることに注意。
using System.Windows.Forms; Button button; //こうも書ける System.Windows.Forms.Button button;
Kotlin
import android.widget.Button var button: Button //こうも書ける var button: android.widget.Button //android.widget以下の全クラスを使うにはこう書く import android.widget.* var button: Button
クラス
class
って書けばいい。ただそれだけ。
クラスの宣言とコンストラクタが融合しかかっているのに注意。
コンストラクタ
クラス宣言の直後に書きます。
class Character(id: Int) { val name = x.toString() init { //コンストラクタで行う処理 } }
どうせコンストラクタでプロパティに代入するなら最初からやっとけばいいじゃん、ってことでコンストラクタにプロパティ定義を含めることができます。コンストラクタに色々書かなくていいから便利。
class Character(val x: Int, val name: String) //これは↓と同じ意味 class Hoge(_id: int, _name: String) { val id = _id val name = _name }
コンストラクタの引数にデフォルト値を設定することもできます。
class Character(val x: Int = 0, val name: String = "なし") //こう呼べる val x = Character() //0,なし val y = Character(3, "たろう") //3, たろう val z = Character(name = "じろう") //0, じろう
複数のコンストラクタ
Kotlinの場合、大体はデフォルト値と名前付き引数でなんとかする思想のようですが、複数のコンストラクタを定義することもできます。この場合はクラス直後のかっこでプロパティを宣言するような便利機能が封印されます。 多分UnityEngine.ColorとSystem.Drawing.ColorとSystem.Windows.Media.Colorが混ざりあった環境など想定していないんでしょう。Googleはすぐdeperecatedして廃止しますからね。
class Character { val id: Int val name: String constructor(_id: Int, _name: String) { id = _id name = _name } constructor(otherData: OtherData) { id = otherData.generateId() name = otherData.name } }
抽象クラス
abstractってつけるだけ。もはや何も言うことがない。
abstract class Character(val id: Int = 0, val name: String = "なし")
データクラス
C# 9で追加されたrecord型みたいなことができます。
record Character(int Id,string Name);
Kotlin
data class Character(val id: Int, val name: String)