2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Kotlin】インターフェイス

Last updated at Posted at 2021-06-02

#■インターフェイス
インターフェイスは継承ではなく実装すると呼ばれている。
意味はほとんど同じ。

インターフェイスは個別で抽象メソッドを渡す事ができる。
継承は基本単一継承と呼ばれ一つまでしか継承できないが,
インターフェイスは複数実装できる。
ここでは実装と言っているが意味は継承と変わらない。

インターフェイスの能力は抽象クラスを用意し抽象メソッドを使用するabstractと同じ能力である。

###■abstractでできない事ができる。
例えばabstractにメソッドが3つ用意されている。
その中の2つだけのメソッドを継承してoverrideして使いたい
しかしabstractは全てのメソッドをoverrideさせないとエラーになる。

そんな時に個別でメソッドを管理できしかも単一継承ではないのでいくらでも
実装できます。

♪イメージ
■abstract
ディナーをコースで注文(これ以上注文できない単一継承)

■インターフェイス(欲しい物だけ注文いくらでも注文できる。)
単品で注文 

コースで注文した時食べれないものがあったらもったいないよね
それなら単品で注文しよって言う事です。

書き方

■インターフェイスにはclassを書かない代わりにinterfaceと書く

//中身は抽象メソッドとなる。
interface Hoge1 {
  fun hoge1()
}

#■実際の実装方法
下記のように実装すれば
欲しいメソッドだけ取り寄せる事ができる。


interface Hoge1 {
 fun hoge1()
}

interface Hoge2 {
 fun hoge2()
}

interface Hoge3 {
  fun hoge3()
}

class HogeA: Hoge1,Hoge2 {
 override fun hoge1() {}
 override fun hoge2() {}
}

class HogeB: Hoge2,Hoge3 {
 override fun hoge2() {}
 override fun hoge3() {}
}

#■インターフェイスの特徴

■コンストラクタを持てない
■abstractやopenなどの修飾子はいらない(あってもエラーにはならない)
■カスタマーアクセサーを使う(最後に説明)

###■継承と実装を同時に行う事ができる。

//継承AAA()クラスと実装インターフェイスBBB{}同時に行っている。
class Child : AAA(), BBB{}

###■インターフェイスのメソッドに元から能力をもつ場合(基本ただの入れ物)
オーバーライドは強制されない!!!!!!
オーバーライドを強制はされないが実装先のインスタンスでinterface先のメソッドを呼び出す事ができる。

interface A{
 fun bar()
 //fooはメソッドの中身を実装しているので抽象メソッドにならない 任意
 fun foo() = println("こんにちわ")
}

class B: A {
   override fun bar() = println("さようなら")
}

val b = B()
//interface先のメソッドを呼び出している。
b.foo()
//結果:こんにちわ

###■異なるインターフェイスでメソッド名が同じ問題

問題が起こる
■異なるインターフェイス
■同じ名前のメソッド
■能力は異なる(デフォルトで実装をもっていてとする。)

classで実装する際えっこれどっちのメソッドですか?となる。

■解決策
<インターフェイス名>.メソッド名()
と書けばどのインターフェイスのメソッドか判断できるようになる。

interface Hoge1 {
 fun hoge() = println("こんにちわ")
}

interface Hoge2 {
 fun hoge() = println("さようなら")
}

//解決策
class MyHoge: Hoge1, Hoge2 {
 overridefun hoge() {
 super<Hoge1>.hoge()
 super<Hoge2>.hoge()
  }
}

###■プロパティも定義できる。抽象プロパティとなる。

interface Hoge1 {
 var a: String
}

class MyHoge: Hoge1 {
 override var a = "こんにちわ"
}

###■インターフェイスの中のプロパティはバッキングフィールドを持てない

■カスタマーアクセサー
基本プロパティでgetを使う際fieldに値が代入され変数に入る
だがfieldが使えないので代わりに新たにプロパティを作りgetterの中身に書く

interface Hoge {
 //fieldの代わりにプロパティを用意
 var price: Int

 val taxIncLudePrice: Int 
 //fieldの代わりにpriceを書く
  get() = (this.price * 1.1).toInt()

  fun checkPrice() {
    println("税込${taxIncLudePrice}円")
  } 
}

class MyHoge: Hoge {
 override var price = 200
}

fun main() {
 var myHoge = MyHoge() 
 //hogeのメソッドを呼び出す。
 myHoge.checkPrice()
}
//結果:税込220円です。
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?