プログラム構造[クラスの継承、可変長引数(vararg)、暗黙のtoStringとそのoverride、ビルダーパターンなど]

  • 投稿者:
  • 投稿カテゴリー:その他

クラスの継承(open)、可変長引数(vararg)、暗黙のtoStringとそのoverride、ビルダーパターンなどの例。内容はソースコード内のコメントを参照。


以下のような注文リストを作成するためのプログラム構造

Order #1
Noodles: $10
Total: $10

Order #2
Noodles: $10
Vegetables Chef’s Choice: $5
Total: $15

Order #3
Noodles: $10
Vegetables Carrots, Beans, Celery: $5
Total: $15

Order #4
Noodles: $10
Vegetables Cabbage, Onion: $5
Total: $15

Order #5
Noodles: $10
Noodles: $10
Vegetables Spinach: $5
Total: $25

// openキーワードの親クラス(Item)
open class Item(val name: String, val price: Int)

// 単純なItemの子クラス
class Noodles : Item("Noodles", 10) {
	// toStringをoverrideしてnameを戻す
    override fun toString(): String {
        return name
    }
}

// Itemの子クラスで、可変長引数(vararg)を持つ
class Vegetables(vararg val toppings: String) : Item("Vegetables", 5) {
	// toStringをoverrideしてnameを戻す
	// (Kotlinでclassを作成するとtoStringメソッドが暗黙的に作成されているのでoverrideできる)
    override fun toString(): String {
        if (toppings.isEmpty()) {
            return "$name Chef's Choice"
        } else {
            return name + " " + toppings.joinToString()
        }
    }
}

// 注文クラス(注文明細を持ち、Itemの追加やprint機能も包含する)
class Order(val orderNumber: Int) {

	// Item型の可変List(注文の明細を格納する)
    private val itemList = mutableListOf<Item>()

	// Item(個別)の明細を追加して自身(Order)を戻す関数
    fun addItem(newItem: Item): Order {
        itemList.add(newItem)
        // 自身(Order)を戻す事によりメイン関数でビルダーパターンを実装可能
        return this
    }

	// Items(複数)の明細を追加して自身(Order)を戻す関数
    fun addAll(newItems: List<Item>): Order {
        itemList.addAll(newItems)
        // 自身(Order)を戻す事によりメイン関数でビルダーパターンを実装可能
        return this
    }

	// 注文内容を表示
    fun print() {
        println("Order #${orderNumber}")
        var total = 0
        for (item in itemList) {
            println("${item}: $${item.price}")
            total += item.price
        }
        println("Total: $${total}")
    }
}

// メイン関数
fun main() {

	// 全ての注文を格納する可変リスト(Order型)
    val ordersList = mutableListOf<Order>()

    // 注文1 Noodlesのみ
    val order1 = Order(1)
    order1.addItem(Noodles())
    ordersList.add(order1)

    // 注文2 Noodlesの注文の後、引数なしのVegetablesを注文
    val order2 = Order(2)
    order2.addItem(Noodles())
    order2.addItem(Vegetables())
    ordersList.add(order2)

    // 注文3 Noodlesと引数ありのVegetablesを同時に注文
    val order3 = Order(3)
    val items = listOf(Noodles(), Vegetables("Carrots", "Beans", "Celery"))
    order3.addAll(items)
    ordersList.add(order3)

    // 注文4 注文3のパターンをビルダーパターンで表記
    // Use builder pattern
    val order4 = Order(4)
        .addItem(Noodles())
        .addItem(Vegetables("Cabbage", "Onion"))
    ordersList.add(order4)

    // 注文5 ビルダーパターンで変数を使わず直接addするパターン
    ordersList.add(
        Order(5)
            .addItem(Noodles())
            .addItem(Noodles())
            .addItem(Vegetables("Spinach"))
    )

    // Print out each order
    for (order in ordersList) {
        order.print()
        println()
    }
}

トレーニング > KOTLIN を用いた ANDROID の基本 > レイアウト > スクロール可能なリスト > Kotlinでリストを使用する > 6. コードを改善する