委譲
日本語 | 委譲 |
英語 | delegation |
ふりがな | いじょう |
フリガナ | イジョウ |
あるクラスの実装を、継承を使わずに他のクラスに任せること。
特定のクラスの機能を、自分が作るクラスにも持たせたい場合に、継承を使わずフィールドとしてそのクラスを持ち、そのクラスのメソッドを呼び出すメソッドを持たせること。つまり、自分が持つべき機能を他のクラスに「委譲」する。
オブジェクト指向用語。
厳密なオブジェクト指向では、継承は「機能の継承」を目的とせず、「スーパークラスはサブクラスの一種である」といういわゆる「is-a」の関係を持たなければならない。
そのため、単に機能を持たせたい場合には、継承ではなく委譲とすることが推奨される。
委譲の実現には多くの場合コンポジションを使用する。
この2つは似ているが、委譲は「目的」であり、コンポジションはその「手段」である。
特定のクラスの機能を、自分が作るクラスにも持たせたい場合に、継承を使わずフィールドとしてそのクラスを持ち、そのクラスのメソッドを呼び出すメソッドを持たせること。つまり、自分が持つべき機能を他のクラスに「委譲」する。
オブジェクト指向用語。
厳密なオブジェクト指向では、継承は「機能の継承」を目的とせず、「スーパークラスはサブクラスの一種である」といういわゆる「is-a」の関係を持たなければならない。
そのため、単に機能を持たせたい場合には、継承ではなく委譲とすることが推奨される。
委譲の実現には多くの場合コンポジションを使用する。
この2つは似ているが、委譲は「目的」であり、コンポジションはその「手段」である。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// 文字列クラスを使ってみます。
Strings strings = new Strings();
strings.append( "あいうえお\n" );
strings.append( "かきくけこ\n" );
strings.append( "さしすせそ\n" );
System.out.println( strings.toString() );
// あいうえお
// かきくけこ
// さしすせそ
}
}
/**
* 文字列クラス。
*/
class Strings
{
/**
* コンポジションを使って、文字列の格納を
* StringBufferクラスに委譲します。
*/
private StringBuffer strbuf = new StringBuffer();
/**
* 文字列を追加します。
*/
public Strings append( String string )
{
strbuf.append( string );
return this;
}
/**
* 文字列を取得します。
*/
public String toString()
{
return strbuf.toString();
}
}
public class Sample
{
public static void main( String[] args )
{
// 文字列クラスを使ってみます。
Strings strings = new Strings();
strings.append( "あいうえお\n" );
strings.append( "かきくけこ\n" );
strings.append( "さしすせそ\n" );
System.out.println( strings.toString() );
// あいうえお
// かきくけこ
// さしすせそ
}
}
/**
* 文字列クラス。
*/
class Strings
{
/**
* コンポジションを使って、文字列の格納を
* StringBufferクラスに委譲します。
*/
private StringBuffer strbuf = new StringBuffer();
/**
* 文字列を追加します。
*/
public Strings append( String string )
{
strbuf.append( string );
return this;
}
/**
* 文字列を取得します。
*/
public String toString()
{
return strbuf.toString();
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // 文字列クラスを使ってみます。 Strings strings = new Strings(); strings.append( "あいうえお\n" ); strings.append( "かきくけこ\n" ); strings.append( "さしすせそ\n" ); System.out.println( strings.toString() ); // あいうえお // かきくけこ // さしすせそ } } /** * 文字列クラス。 */ class Strings { /** * コンポジションを使って、文字列の格納を * StringBufferクラスに委譲します。 */ private StringBuffer strbuf = new StringBuffer(); /** * 文字列を追加します。 */ public Strings append( String string ) { strbuf.append( string ); return this; } /** * 文字列を取得します。 */ public String toString() { return strbuf.toString(); } }