初心者のためのOOPの概念:ポリモーフィズムの説明

公開: 2021-12-10

PythonやJavaなどの高級言語では、OOPまたはオブジェクト指向プログラミングは、ロジックや関数ではなく、データやオブジェクトを中心としたソフトウェア設計組織を指します。 オブジェクトは、固有の属性と動作を持つデータフィールドとして定義されます。 言い換えれば、OOPはロジックではなくオブジェクトに焦点を合わせています。 このようなプログラミングモデルは、アクティブな更新とメンテナンスを必要とする大規模で複雑なプログラムに最適です。 さらに、スケーラビリティ、効率、およびコードの再利用性という追加の利点がテーブルにもたらされます。

OOPには、ポリモーフィズム、カプセル化、抽象化、継承という4つの基本的な構成要素があります。 この記事の範囲はOOPのポリモーフィズムに限定されているため、JavaのポリモーフィズムやPythonのポリモーフィズムの例を含め、ポリモーフィズムについて詳しく説明します。

世界のトップ大学からオンラインでソフトウェアコースを学びましょう。 エグゼクティブPGプログラム、高度な証明書プログラム、または修士プログラムを取得して、キャリアを早急に進めましょう。

目次

ポリモーフィズムの定義

最も単純なポリモーフィズムの定義は、ポリモーフィズムがさまざまな形で存在することを意味するということです。 それは2つのギリシャ語にそのルーツを持っています-「ポリ」は「多数」を意味し、「モーフ」は「フォーム」に変換されます。

概念をよりよく理解するために、最初に簡単な例を見てみましょう。 カーソルの動作の例を見てみましょう。これは、マウスやトラックパッドを使用するたびに画面上を移動するのとまったく同じカーソルです。 ユーザーの操作またはプログラムモードに応じて、カーソルは、矢印、十字、線、人差し指など、さまざまな形をとることができます。

ポリモーフィズムは、OOPの最も重要な機能の1つです。 JavaとPythonでは、変数、オブジェクト、および関数はさまざまな形式で存在できます。 ポリモーフィズムでは、サブクラスまたはメソッドは、親クラスの機能の一部を保持しながら、その属性と動作を定義します。 これにより、継承が可能になります。これにより、基本クラスがその属性と動作を派生クラスに与えるクラス階層を作成できます。 その後、派生クラスの機能は、必要に応じて自由に変更または拡張できます。 この目的のために、ポリモーフィズムは、呼び出し元のオブジェクトのタイプに基づいて正しいメソッドが実行されることを保証します。

概観するために、日付と時刻を表示するクラスがあるとします。 ここで、クラスを継承し、「Hello!」というメッセージを表示するメソッドを作成します。 日付と時刻とともに。

Javaでのポリモーフィズムの例

メソッド「area()」を持つスーパークラス「Shapes」について考えてみます。 「Shape」の下のサブクラスには、「Rectangle」、「Circle」、「Triangle」などがあり、各サブクラスには、面積を計算するためのメソッドがあります。 サブクラスは、継承とポリモーフィズムの概念を適用して、「area()」メソッドを使用して、それぞれの形状の面積を計算するための式を見つけます。

クラスShapes{

public void area(){

System.out.println( "面積の式");

}

}

クラスTriangleextendsShapes {

public void area(){

System.out.println("三角形は1/2*ベース*高さ");

}

}

クラスCircleはShapesを拡張します{

public void area(){

System.out.println("円は3.14*半径*半径");

}

}

クラスメイン{

public static void main(String [] args){

Shapes myShape = new Shapes(); //Shapesオブジェクトを作成します

形状myTriangle=new Triangle(); //Triangleオブジェクトを作成します

形状myCircle=new Circle(); //Circleオブジェクトを作成します

myShape.area();

myTriangle.area();

myShape.area();

myCircle.area();

}

}

上記のプログラムコードの出力は次のようになります。

三角形の面積の式は1/2*底辺*高さです

円の面積の式は3.14*半径*半径です

OOPにおけるポリモーフィズムのタイプ

OOPのポリモーフィズムには、静的(コンパイル時のポリモーフィズム)と動的(実行時のポリモーフィズム)の2つのタイプがあります。

1.静的ポリモーフィズム

Javaでは、メソッドのオーバーロードが最も一般的なタイプの静的ポリモーフィズムです。 同じクラス内に、異なるパラメーターを使用して、同じ名前の複数のメソッドを作成できます。 パラメータセットは、次の3つの基準の少なくとも1つが異なる必要があります。

  • メソッドには、異なる数のパラメーターが必要です。
  • パラメータタイプは異なる必要があります。 たとえば、一方のメソッドがLongを受け入れる場合、もう一方のメソッドはStringを受け入れます。
  • メソッドは、さまざまな順序でパラメーターを受け入れる必要があります。 たとえば、メソッド1がLongとStringを受け入れる場合、メソッド2はStringを受け入れてからLongを受け入れる必要があります。

メソッドのオーバーロードでは、メソッドの呼び出し中に、コンパイラーは呼び出し中に渡されたパラメーターに基づいて呼び出すメソッドを選択します。 これはコンパイル時に行われるため、このタイプのポリモーフィズムはコンパイル時のポリモーフィズムとも呼ばれます。

以下は、コンパイル時のポリモーフィズムを示すJavaコードの例です。 この例では、メソッドadds()は2つの異なるタイプのパラメーターでオーバーロードされています。

パッケージstaticPolymorphism;

パブリッククラスの追加

{{

void sum(int x、int y)

{{

int c = x + y;

System.out.println( "2つの数値の加算:" + c); }

void sum(int x、int y、int z)

{{

int c = x + y + z;

System.out.println( "3つの数値の加算:" + c); }

public static void main(String [] args)

{{

Addition obj = new Addition();

obj.sum(45,34);

obj.sum(60、32、11);

}

}

上記のプログラムの出力は次のようになります。

2つの数字の加算:79

3つの数字の追加:103

2.動的ポリモーフィズム

動的または実行時のポリモーフィズムは、メソッドのオーバーライドによって実現されます。 ここで、メソッドはさまざまなクラスでさまざまな形式になっており(メソッドのオーバーライド)、コンパイル時ではなく、オーバーライドされたメソッドの呼び出しが実行時に解決されます。 これで、オブジェクトをクラス参照に割り当ててメソッドを呼び出すと、オブジェクトのクラスのメソッドが実行されます。 オブジェクトは実行時に作成されるため、実行する必要のある(オブジェクト内の)メソッドの形式は実行時にのみ決定されます。

以下は、ランタイムポリモーフィズムを示すJavaコードの例です。 この例では、スーパークラス「動物」と3つのサブクラス、「カンガルー」、「トラ」、「魚」があります。 サブクラスはスーパークラスを拡張し、その「move()」メソッドをオーバーライドします。 「move()」メソッドは、親クラス「Animal」の参照変数によって呼び出されます。

クラス動物{

void move(){

System.out.println( "Animals Move");

}

}

クラスカンガルーは動物を拡張します{

void move(){

System.out.println( "カンガルージャンプ");

}

}

クラスタイガーは動物を拡張します{

void move(){

System.out.println( "タイガースウォーク");

}

}

クラスの魚は動物を拡張します{

void move(){

System.out.println( "魚の泳ぎ");

}

}

クラスメイン{

public static void main(String args []){

動物A=new Animal();

動物k=new kangaroo(); //アップキャスト

動物t=new tiger(); //アップキャスト

動物f=new fish(); //アップキャスト

動き();

k.move();

t.move();

f.move();

}

}

上記のプログラムの出力は次のようになります。

動物が動く

カンガルージャンプ

タイガースウォーク

魚が泳ぐ

Pythonのポリモーフィズム

Pythonのポリモーフィズムには、演算子ポリモーフィズム、関数ポリモーフィズム、クラスポリモーフィズムの3つのタイプがあります。 Pythonでは、メソッドのオーバーライドも許可されていますが、メソッドのオーバーロードは許可されていません。

1.演算子のポリモーフィズム

Pythonでは、「+」演算子には2つの使用法があります。 整数データ型の場合は算術加算演算に使用され、文字列の場合は「+」演算子が連結を実行します。

以下は、「+」演算子が整数データ型に対して加算を実行するPythonコード例です。

num1 = 4

num2 = 5

print(num1 + num2)

上記のプログラムコードの出力は「9」です。

以下は、「+」演算子が文字列データ型に対して連結を実行するPythonコード例です。

str1=「良い」

str2=「夕方」

print(str1 +”“ + str2)

上記のプログラムの出力は「こんばんは」になります。

2.関数ポリモーフィズム

Pythonの「len()」関数は、リスト、文字列、タプル、辞書、セットなどのさまざまなデータ型と互換性がありますが、データ型ごとに特定の情報を返します。 次に例を示します。

print(len( "Programer"))

print(len([“ Python”、“ Java”、“ C”]))

print(len({“ Name”:“ Kathy”、“ Address”:“ Texas”}))

上記のプログラムの出力は次のとおりです。

9

3

2

3.クラスポリモーフィズム

ポリモーフィズムの概念を拡張することで、Pythonでは複数のクラスが同じ名前のメソッドを持つことができます。 以下に示すのは、Pythonのクラスメソッドのポリモーフィズムを示す例です。 この例では、「Cat」と「Dog」の2つのクラスがあります。 それらは同様の構造を持ち、同じメソッド名「make_sound()」および「info()」を持っています。

クラス猫:

def __init __(self、name、age):

self.name = name

self.age=年齢

def info(self):

print(f”私は猫です。私の名前は{self.name}です。私は{self.age}歳です。”)

def make_sound(self):

print( "Meow")

クラス犬:

def __init __(self、name、age):

self.name = name

self.age=年齢

def info(self):

print(f”私は犬です。私の名前は{self.name}です。私は{self.age}歳です。”)

def make_sound(self):

print( "Bark")

cat1 = Cat(“ Minnie”、3)

dog1 = Dog(“ Tom”、6)

(cat1、dog1)の動物の場合:

animal.make_sound()

animal.info()

animal.make_sound()

出力は次のようになります。

ニャー

吾輩は猫である。 私の名前はミニーです。 私は3歳です。

ニャー

吠える

私は犬です。 私はトムです。 私は6歳です。

吠える

4.メソッドのオーバーライド

Pythonでは、子クラスが親クラスから属性とメソッドを継承することもできます。 特定のメソッドと属性は、子クラスに合うように再定義できます(メソッドのオーバーライド)。 次に、ポリモーフィズムにより、親クラスと同じ名前のオーバーライドされたメソッドと属性にアクセスできます。

以下は、メソッドのオーバーライドを説明するPythonコードの例です。

数学インポート円周率から

クラス形状:

def __init __(self、name):

self.name = name

def area(self):

合格

def fact(self):

「私は閉じた人物です。」を返します。

def __str __(self):

self.nameを返します

クラスSquare(Shape):

def __init __(self、length):

super().__ init __( "Square")

self.length=長さ

def area(self):

self.length**2を返します

def fact(self):

「正方形の各角度は90度に等しい」を返します。

クラスCircle(Shape):

def __init __(self、radius):

super().__ init __( "Circle")

self.radius=半径

def area(self):

pi * self.radius**2を返します

a = Square(4)

b = Circle(7)

print(b)

print(b.fact())

print(a.fact())

print(b.area())

上記のプログラムの出力は次のとおりです。

サークル

私は閉じた姿です。

正方形の各角度は90度に相当します。

153.93804002589985

メソッドのオーバーライドの詳細をご覧ください。

OOPにおけるポリモーフィズムの利点

OOPのポリモーフィズムには、3つの重要な利点があります。 それらは次のとおりです。

  • ポリモーフィズムにより、コードの再利用が可能になります。 したがって、クラスが作成され、テストされ、実装されると、それらを何度も再利用できます。 さらに、元のコードに影響を与えることなくコードを変更できます。 そのすべてが、コーダーの時間を大幅に節約します。
  • ポリモーフィズムでは、複数のデータ値を1つの変数に格納できます。 さらに、スーパークラスからサブクラスに継承された変数の値は、スーパークラスまたはサブクラスの変数の値を変更せずに変更できます。
  • 最後に、ポリモーフィズムはより少ないコード行で機能するため、プログラマーはデバッグを容易にできます。

今後の方向性

upGradは、一流のリバプールジョンムーア大学と提携して、データサイエンスプログラムの厳密なオンライン修士号を提供しています。 データサイエンスでのキャリアを目指している働く専門家のために。 コースは、LJMUの修士号と、IIITバンガロアのエグゼクティブPGプログラム認定で終了します。

プログラムのハイライト:

  • 500時間以上のコンテンツ、60以上のケーススタディとプロジェクト、20以上のライブセッション
  • Python、AWS、MySQLなどの14以上のツールとソフトウェアを包括的にカバー
  • 業界の専門家とのコーチングセッション
  • ピアラーニングと業界ネットワーキング
  • 360度のキャリア支援

今日の最高の高度なEdTechプラットフォームの1つであるupGradは、最先端のテクノロジー、最新の教育法、業界パートナーシップ、および世界クラスの教員の組み合わせを通じて、学習者に刺激を与え、準備を続けています。

世界のトップ大学からオンラインでデータサイエンスコースを学びましょう。 エグゼクティブPGプログラム、高度な証明書プログラム、または修士プログラムを取得して、キャリアを早急に進めましょう。

OOPでポリモーフィズムが使用されるのはなぜですか?

OOPでは、ポリモーフィズムは、それを呼び出すオブジェクトのクラスに基づいてさまざまなタスクを実行するメソッドです。 したがって、メッセージは複数のクラスのオブジェクトに送信され、すべてのオブジェクトはクラスのプロパティに従って応答します。

Javaでのメソッドのオーバーロードとは何ですか?

Javaでは、同じ名前の2つ以上のメソッドのパラメーターが異なる場合があります(パラメーターのタイプ、パラメーターの数、またはその両方)。 このようなメソッドはオーバーロードされたメソッドと呼ばれ、この機能はメソッドのオーバーロードと呼ばれます。

オーバーロードとオーバーライドの違いは何ですか?

同じクラスの2つ以上のメソッドのパラメーターが異なるが名前が同じである場合、それはオーバーロードと呼ばれます。 一方、オーバーライドとは、スーパークラスと子クラスが同じメソッドシグネチャ(名前とパラメーター)を持っている場合です。