この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

クラスの拡張

クラスを拡張して、より特化した動作を指定できます。

クラス拡張するクラスは、拡張元のクラスのすべてのメソッドとプロパティを継承します。さらに、拡張クラスでは、メソッド定義で override キーワードを使用して既存の仮想メソッドを上書きできます。仮想メソッドを上書きすることで、既存のメソッドの異なる実装方法を使用できます。つまり、特定のメソッドの動作がコールするオブジェクトによって異なることになります。これは「多態性」と呼ばれます。

クラス拡張には、クラス定義で extends キーワードを使用します。クラスは、別のクラスを 1 つまでしか拡張できませんが、複数のインターフェースを実装できます。

次の例では、クラスを拡張する方法を示します。YellowMarker クラスは、Marker クラスを拡張しています。

1swfobject.registerObject("clippy.codeblock-0", "9");public virtual class Marker {
2    public virtual void write() {
3        System.debug('Writing some text.');
4    }
5
6    public virtual Double discount() {
7        return .05;
8    }
9}
10
1swfobject.registerObject("clippy.codeblock-1", "9");// Extension for the Marker class
2public class YellowMarker extends Marker {
3    public override void write() {
4        System.debug('Writing some text using the yellow marker.');
5    } 
6}    
7
次のコードセグメントは多態性を示しています。この例では同じデータ型 (Marker) の 2 つのオブジェクトを宣言しています。両方のオブジェクトはマーカーですが、2 番目のオブジェクトは YellowMarker クラスのインスタンスに割り当てられています。そのため、2 番目のオブジェクトで write メソッドをコールすると、このメソッドは上書きされているため、最初のオブジェクトでのこのメソッドのコール結果とは異なります。discount メソッドは YellowMarker クラス定義には含まれていませんが、拡張元のクラスに含まれているため拡張クラス YellowMarker でも使用可能になり、2 番目のオブジェクトでこのメソッドをコールできます。
1swfobject.registerObject("clippy.codeblock-2", "9");Marker obj1, obj2;
2obj1 = new Marker();
3// This outputs 'Writing some text.'
4obj1.write();
5
6obj2 = new YellowMarker();
7// This outputs 'Writing some text using the yellow marker.'
8obj2.write();
9// We get the discount method for free
10// and can call it from the YellowMarker instance.
11Double d = obj2.discount();
12

拡張クラスでは、拡張元のクラスとは共通しない追加のメソッド定義も使用できます。たとえば、次の RedMarker クラスは Marker クラスを拡張し、Marker クラスでは使用できない追加メソッド computePrice が含まれています。この追加メソッドをコールするには、オブジェクトデータ型が拡張クラスである必要があります。

1swfobject.registerObject("clippy.codeblock-3", "9");// Extension for the Marker class
2public class RedMarker extends Marker {
3    public override void write() {
4        System.debug('Writing some text in red.');
5    } 
6
7    // Method only in this class
8    public Double computePrice() {
9        return 1.5;
10    }
11}    
12

次の例では、RedMarker クラスの追加メソッドをコールする方法を示します。

1RedMarker obj = new RedMarker();
2// Call method specific to RedMarker only
3Double price = obj.computePrice();

拡張はインターフェースにも適用され、インターフェースが別のインターフェースを拡張することもできます。クラスでは、インターフェースが別のインターフェースを拡張すると、拡張元のインターフェースのすべてのメソッドとプロパティが拡張先のインターフェースでも利用できます。