最近、Scalaの勉強を初めて、改めて書籍を読み進めているのだが、その際にオブジェクト思向の概念の1つである、ポリモーフィズムについてのテーマがあり、もう一度概念を抑えておきたく思い、ここに記す事にした。
ちなみにScalaは、オブジェクト指向型であり、関数型でもある、マルチパラダイムな言語である。
ポリモーフィズムとは
ポリモーフィズムとは、継承したサブクラスによって異なる動作を実装する仕組み。複数のインスタンスで同じメソッドを呼び出し、それぞれに合った実装を呼び出す事ができる。
実際にポリモーフィズムをコードで説明してみる
今回、例として、「図形」、「三角形」、「四角形」を表すクラスを表現する事を考えてみる。drawメソッドを呼び出す事で、
その図形の形を出力してくれるものとする。
abstract class shape {
def draw(): Unit = {
println('不明な図形')
}
}
class Triangle extends shape {
override def draw():Unit = {
println('三角形')
}
}
class Rectangle extends shape {
override def draw():Unit = {
println('四角形')
}
}
最初に抽象クラスであり、スーパークラスである、shapeを定義している。これに対して、Triangleクラスと、Rectangleクラスを定義した。extendsを使って、スーパークラスである、shapeクラスのサブクラスとして、定義している。また、各々2つのサブクラス内のメソッド定義時に、overrideする事で、スーパークラスのメソッドをオーバーライドしている。
var shape:Shape = new Triangle
shape.draw() //三角形
var shape:Shape = new Rectangle
shape.draw() //四角形
ポリモーフィズムの何が便利か
ポリモーフィズムを実現する事により、オブジェクト思向における再利用性が高まるのと同時に、サブクラスのメソッドを同じ方法で呼び出す事ができる。
ポリモーフィズムを使わない実装をすると、TriangleクラスとRectangleクラス各々で、新たに別のメソッドを新規に作成する事になってしまう。
これらを踏まえて冗長なコーディングがないように心がけたい。