メソッド(コンピュータープログラミング)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

オブジェクト指向プログラミング(OOP)メソッドは、メッセージオブジェクトに関連付けられたプロシージャです。オブジェクトはデータ動作で構成されます。これらは、さまざまなコンシューマーがオブジェクトをどのように利用できるかを指定するインターフェースを構成します。[1]

データはオブジェクトのプロパティとして表され、動作はメソッドとして表されます。たとえば、オブジェクトはandWindowなどのメソッドを持つことができますが、その状態(任意の時点で開いているか閉じているか)はプロパティになります。 openclose

クラスベースプログラミングでは、メソッドはクラス内で定義され、オブジェクトは特定のクラスのインスタンスです。メソッドが提供する最も重要な機能の1つは、メソッドのオーバーライドです。同じ名前(たとえば、area)を複数の異なる種類のクラスに使用できます。これにより、送信オブジェクトはビヘイビアーを呼び出し、それらのビヘイビアーの実装を受信オブジェクトに委任できます。Javaプログラミングのメソッドは、クラスオブジェクトの動作を設定します。たとえば、オブジェクトは別のオブジェクトにメッセージを送信でき、受信オブジェクトが、、、などareaあるかどうかに関係なく、適切な式が呼び出されますrectanglecircletriangle

メソッドは、他のクラスがオブジェクトのプロパティにアクセスして変更するために使用するインターフェイスも提供します。これはカプセル化として知られています。カプセル化とオーバーライドは、メソッドとプロシージャ呼び出しを区別する2つの主要な機能です。[2]

オーバーライドとオーバーロード

メソッドのオーバーライドとオーバーロードは、メソッドが従来のプロシージャまたは関数呼び出しと異なる最も重要な2つの方法です。オーバーライドとは、スーパークラスのメソッドの実装を再定義するサブクラスを指します。たとえばfindArea、形状クラスで定義されたメソッドである可能性があります[3] triangleなどは、それぞれが面積を計算するための適切な式を定義します。オブジェクトを「ブラックボックス」と見なして、オブジェクトを使用する他のオブジェクトへの影響を最小限に抑えて、オブジェクトの内部を変更できるようにするという考え方です。これはカプセル化と呼ばれ、コードの保守と再利用を容易にすることを目的としています。

一方、メソッドのオーバーロードとは、メソッドのパラメーターに基づいてメッセージの処理に使用されるコードを区別することです。受信オブジェクトを任意のメソッドの最初のパラメーターと見なす場合、オーバーライドは、選択が最初の引数のみに基づくオーバーロードの特殊なケースにすぎません。次の簡単なJavaの例は、違いを示しています。

アクセサー、ミューテーター、マネージャーのメソッド

アクセサメソッドは、オブジェクトのデータ値を読み取るために使用されます。ミューテイタメソッドは、オブジェクトのデータを変更するために使用されます。Managerメソッドは、コンストラクタやデストラクタなどのクラスのオブジェクトを初期化および破棄するために使用されます。

これらのメソッドは、カプセル化モジュール化を容易にする抽象化レイヤーを提供します。たとえば、銀行口座クラスが(残高データフィールドに直接アクセスするのではなく)現在の残高を取得するためのアクセサメソッドを提供する場合、同じコードのその後のリビジョンは、残高取得のためのより複雑なメカニズム(たとえば、データベース)を実装できます。フェッチ)、依存コードを変更する必要はありません。カプセル化とモジュール性の概念は、オブジェクト指向プログラミングに固有のものではありません。実際、多くの点で、オブジェクト指向のアプローチは、抽象データ型getBalance()構造化プログラミング[4]

コンストラクター

コンストラクタは、オブジェクトと呼ばれるプロセスを作成し、初期化するために、オブジェクトの有効期間の開始時に呼び出されるメソッドである建設(またはインスタンス化を)。初期化には、リソースの取得が含まれる場合があります。コンストラクターにはパラメーターがある場合がありますが、通常、ほとんどの言語では値を返しません。Javaで次の例を参照してください。

パブリック クラス Main  { 
    String  _name ; 
    int  _roll ;

    Main String  name  int  roll  {  //コンストラクターメソッド
        this _name  =  name ; 
        これ_roll  = ロール; 
    } 
}

デストラクタ

デストラクタは、オブジェクトの存続期間の終了時に自動的に呼び出されるメソッドであり、破棄と呼ばれるプロセスです。ほとんどの言語でのデストラクタは、デストラクタメソッドの引数や戻り値を許可しません。オブジェクト破壊時にクリーンアップの雑用やその他のタスクを実行するために、破壊を実装できます。

ファイナライザー

JavaC#Pythonなどのガベージコレクションされた言語ではデストラクタはファイナライザと呼ばれます。これらはデストラクタと同様の目的と機能を持っていますが、ガベージコレクションを利用する言語と手動のメモリ管理を使用する言語の違いにより、呼び出される順序が異なります。

抽象メソッド

抽象メソッドは、署名のみを持ち実装本体を持たないメソッドですこれは、サブクラスがメソッドの実装を提供する必要があることを指定するためによく使用されます。一部のプログラミング言語では、抽象メソッドを使用してインターフェイスを指定します。[5]

次のJavaコードは、拡張が必要な​​抽象クラスを示しています。

抽象 クラス Shape  {
    抽象 int 領域int  h  int  w );  //抽象メソッドシグネチャ
}

次のサブクラスはメインクラスを拡張します。

public  class  Rectangle  extends  Shape  { 
    @Override 
    int  area int  h  int  w  { 
        return  h  *  w ; 
    } 
}

再抽象化

サブクラスが抽象メソッドの実装を提供する場合、別のサブクラスがそれを再び抽象にすることができます。これは再抽象化と呼ばれます。

実際には、これはめったに使用されません。

C#では、仮想メソッドを抽象メソッドでオーバーライドできます。(これは、すべての非プライベートメソッドが仮想であるJavaにも当てはまります。)

クラス IA 
{ 
    public  virtual  void  M () {  } 
}
抽象 クラス IB   IA 
{ 
    public  override  abstract  void  M ();  //許可
}

インターフェイスのデフォルトメソッドも再抽象化でき、サブクラスで実装する必要があります。(これはJavaにも当てはまります。)

インターフェイス IA 
{ 
    void  M  {  } 
}
インターフェイス IB   IA 
{
    抽象 voidIA  M (); }クラスC IB { } //エラー:クラス「C」は「IA.M」を実装していません。

      

クラスメソッド

クラスメソッドは、インスタンスではなくクラスで呼び出されるメソッドです。これらは通常、オブジェクトメタモデルの一部として使用されます。つまり、クラスごとに、メタモデルでクラスオブジェクトのインスタンスが作成されます。 メタモデルプロトコルを使用すると、クラスを作成および削除できます。この意味で、これらは上記のコンストラクタおよびデストラクタと同じ機能を提供します。ただし、 Common Lisp Object System(CLOS)などの一部の言語では、メタモデルを使用すると、開発者は実行時にオブジェクトモデルを動的に変更できます。たとえば、新しいクラスの作成、クラス階層の再定義、プロパティの変更などです。

特別なメソッド

特別なメソッドは非常に言語固有であり、言語はここで定義された特別なメソッドをまったく、一部、またはすべてサポートしない場合があります。言語のコンパイラーはデフォルトの特殊メソッドを自動的に生成するか、プログラマーはオプションで特殊メソッドを定義することができます。ほとんどの特別なメソッドを直接呼び出すことはできませんが、コンパイラは適切なタイミングでそれらを呼び出すためのコードを生成します。

静的メソッド

静的メソッドは、特定のインスタンスではなく、クラスのすべてのインスタンスに関連することを目的としています。その意味で静的変数に似ています。例として、クラスのすべてのインスタンスのすべての変数の値を合計する静的メソッドがあります。たとえば、Productクラスがある場合、すべての製品の平均価格を計算する静的メソッドがある可能性があります。

Javaでは、一般的に使用される静的メソッドは次のとおりです。

Math.max(double a、double b)

この静的メソッドには所有オブジェクトがなく、インスタンスでは実行されません。引数からすべての情報を受け取ります。[3]

クラスのインスタンスがまだ存在しない場合でも、静的メソッドを呼び出すことができます。静的メソッドは、オブジェクトの実行時型に基づいて多態的に解決されるインスタンスメソッドの場合のように動的ではなく、呼び出されるクラスに基づいて コンパイル時に解決されるため、「静的」と呼ばれます。

コピー代入演算子

コピー代入演算子は、クラスオブジェクトが同じタイプのクラスオブジェクトに割り当てられたときにコンパイラによって実行されるアクションを定義します。

演算子メソッド

演算子メソッドは、演算子シンボルを定義または再定義し、シンボルと関連するメソッドパラメーターを使用して実行される操作を定義します。C ++の例:

#include <文字列> 

クラス データ{ 
 パブリック
  bool演算子< const Data data const { return roll_ < data roll_ ; }          
  bool演算子== const Data data const {     
    name_ == dataを返しますname_ && roll_ == data roll_ ;       
  }

 プライベート
  std :: string name_ ; 
  int roll_ ; 
};

C ++のメンバー関数

一部の手続き型言語は、オブジェクト指向機能で拡張され、それらの言語の大規模なスキルセットとレガシーコードを活用しながら、オブジェクト指向開発の利点を提供します。おそらく最もよく知られている例は、 Cプログラミング言語のオブジェクト指向拡張であるC ++です。オブジェクト指向パラダイムを既存の手続き型言語に追加するための設計要件により、C ++でのメッセージパッシングにはいくつかの独自の機能と用語があります。たとえば、C ++では、メソッドはメンバー関数と呼ばれます。 C ++には派生クラスオーバーライドできるメンバー関数である仮想関数の概念もあります。動的ディスパッチ

仮想関数

仮想関数は、C ++クラスがポリモーフィックな動作を実現するための手段です。非仮想メンバー関数、または通常のメソッドは、ポリモーフィズムに参加しないです。

C ++の例:

#include <iostream> 
#include <メモリ> 

クラス スーパー{ 
 パブリック
  virtual〜Super =デフォルト; _   

  virtual void IAm (){ std :: cout << "私はスーパークラスです!\ n " ; }       
};

クラス サブパブリックスーパー{    
 パブリック
  void IAm ()override { std :: cout << "私はサブクラスです!\ n " ; }       
};

int main (){  
  std :: unique_ptr < Super > inst1 = std :: make_unique < Super > ();   
  std :: unique_ptr < Super > inst2 = std :: make_unique < Sub > ();   

  inst1- > IAm (); // | Super :: IAm |を呼び出します。inst2- > IAm (); // | Sub :: IAm |を呼び出します。}  
    

も参照してください

メモ

  1. ^ オブジェクトのコンシューマーは、他のプログラム、リモートコンピューターシステム、またはオブジェクトを独自のプログラムの一部として利用したいコンピュータープログラマーなど、さまざまな種類の要素で構成されている場合があります。
  2. ^ 「オブジェクトとは何ですか?」oracle.comOracleCorporation 2013年12月13日取得
  3. ^ a b マーチン、ロバートC.(2009)。クリーンコード:アジャイルソフトウェアの職人技のハンドブックプレンティスホール。p。296. ISBN 978-0-13-235088-4
  4. ^ Meyer、Bertrand(1988)。オブジェクト指向ソフトウェア構築ケンブリッジ:コンピュータサイエンスのプレンティスホールインターナショナルシリーズ。pp。52–54。ISBN 0-13-629049-3
  5. ^ 「抽象メソッドとクラス」oracle.comOracleJavaドキュメント2014年12月11日取得

参考文献