クラスの拡張
クラス拡張するクラスは、拡張元のクラスのすべてのメソッドとプロパティを継承します。さらに、拡張クラスでは、メソッド定義で override キーワードを使用して既存の仮想メソッドを上書きできます。仮想メソッドを上書きすることで、既存のメソッドの異なる実装方法を使用できます。つまり、特定のメソッドの動作がコールするオブジェクトによって異なることになります。これは「多態性」と呼ばれます。
クラス拡張には、クラス定義で extends キーワードを使用します。クラスは、別のクラスを 1 つまでしか拡張できませんが、複数のインターフェースを実装できます。
この例は、YellowMarker クラスで Marker クラスを拡張する方法を示しています。このセクションの継承の例を実行するには、まず Marker クラスを作成します。
1public 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}次に、Marker クラスを拡張する YellowMarker クラスを作成します。
1// 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}1Marker 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();拡張クラスでは、拡張元のクラスとは共通しない追加のメソッド定義も使用できます。この例の場合、RedMarker クラスは Marker クラスを拡張し、Marker クラスでは使用できない追加メソッド computePrice が含まれています。この追加メソッドをコールするには、オブジェクトデータ型が拡張クラスである必要があります。
次のスニペットを実行する前に、RedMarker クラスを作成します。これは、組織の Marker クラスを必要とします。
1// 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}次のスニペットは、RedMarker クラスの追加メソッドをコールする方法を示しています。開発者コンソールの [Execute Anonymous (匿名実行)] ウィンドウで、次のスニペットを実行します。
1RedMarker obj = new RedMarker();
2// Call method specific to RedMarker only
3Double price = obj.computePrice();拡張はインターフェースにも適用され、インターフェースが別のインターフェースを拡張することもできます。クラスでは、インターフェースが別のインターフェースを拡張すると、拡張元のインターフェースのすべてのメソッドとプロパティが拡張先のインターフェースでも利用できます。
バージョン管理動作の変更
API バージョン 50.0 以降の場合、範囲およびアクセシビリティのルールは、@namespaceAccessible アノテーションが付加されている Apex 変数、メソッド、内部クラス、およびインターフェースに適用されます。アクセシビリティの考慮事項については、「NamespaceAccessible アノテーション」を参照してください。名前空間ベースの参照についての詳細は、「���二世代パッケージでの Apex クラスの名前空間ベースの参照」を参照してください。