抽象クラス
    クラスのメンバーにキーワード「abstract」をつけて宣言することができます。
    これを抽象メンバーと言います。
    抽象メンバーは処理や値といった具体的な実装を持ちません(持つことができません)
    抽象メンバを持つクラスを抽象クラスと呼び、このクラスにも「abstract」キーワードを付ける必要があります。
    抽象クラスはインスタンス化することができません。
    その理由は、抽象クラスは抽象メンバという具体的な実装を持たないメンバーが含んでいて、
    それ単体では不完全な状態だからです。
fun main(args: Array) {
    // Personは抽象クラスなのでインスタンス化できない
    // 以下のコードはビルドエラーになる
    // val someone = Person("someone")
}
abstract class Person(name: String) {
    abstract var name: String
    abstract fun describe()
}  
    抽象メンバーは自動的にオーバーライド可能な「open」になります。
    抽象クラスを直接インスタンス化することはできませんが、
    抽象クラスを検証した派生クラスで抽象メンバーをオーバーライドして具体的な実装を与えることで
    利用することができます。
fun main(args: Array) {
    val someone: Person = Student("suzuki")
    someone.describe()
}
abstract class Person(name: String) {
    abstract var name: String
    abstract fun describe()
}
class Student(name: String) : Person(name) {
    override var name = name
    override fun describe() {
        println("name: ${name}")
    }
}  name: suzuki インターフェース
    KotlinにはJavaと同じようなインターフェースが存在します。
    インターフェースと抽象クラスとの違いは、データを保持できるかどうかです。
fun main(args: Array) {
    val someone: Printable = Student("suzuki")
    someone.Print()
    someone.PrintImpl()
}
interface Printable {
    fun Print() // 何もしないと自動的に「open」で「abstract」
    fun PrintImpl() {
        // インターフェースの関数でも実装することは可能
        println("print impl")
    }
}
class Student(name: String) : Printable {
    val name = name
    override fun Print() {
        println("name = ${name}")
    }
}  name = suzuki
print impl