アンセケターメンはてなエディション

いつどこで誰に見られても恥ずかしいコードが置かれています

C#erのKotlin/Android入門記 #3 クラス

入門記3回目。クラス周りについて。

なんか.NET MAUIがRC公開を重ねてるけど非Preview版のVisual StudioでGAするのは22年後半らしいのでまだセーフ。あれ君22Q2にリリースって言ってなかったっけ?

パッケージとインポート

パッケージはC#でいう名前空間に相当するもの(のはず)。Kotlinでは1ファイルに複数パッケージを含めることができません。C# 10で導入されたFile Scoped Namespacesのイメージ。

C#

namespace Sample;

//何もつけないとpublicと同義
class Hoge {
}

Kotlin

package com.example.sample

//何もつけないとpublicと同義
class Hoge {
}

インポートはC#でいうusingに相当するが、クラス名まで書く必要があることに注意。

C#

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型みたいなことができます。

C#

record Character(int Id,string Name);

Kotlin

data class Character(val id: Int, val name: String)

こうして見るとC#って他の言語のいいところをけっこう取り込んでますね。後方互換性をかなり保ちつつ。(ここ重要)