問題
開発者は、インスタンス化できないShippingCalculatorクラスを作成する必要があり、サブクラスがオーバーライドできるcalculateメソッドの実用的なデフォルト実装を含める必要があります。 ShippingCalculatorクラスの正しい実装はどれですか。
- Public abstract class ShippingCalculator {
public override calculate() { /*implementation*/ }
} - Public abstract class ShippingCalculator {
public virtual void calculate() { /*implementation*/ }
} - Public abstract class ShippingCalculator {
public abstract calculate() { /*implementation*/ }
} - Public abstract class ShippingCalculator {
public void calculate() { /*implementation*/ }
}
正解
- Public abstract class ShippingCalculator {
public override calculate() { /*implementation*/ }
} - Public abstract class ShippingCalculator {
public virtual void calculate() { /*implementation*/ }
} - Public abstract class ShippingCalculator {
public abstract calculate() { /*implementation*/ }
} - Public abstract class ShippingCalculator {
public void calculate() { /*implementation*/ }
}
解説
問題文の内容を元に、必要な要件を明確に箇条書きで整理します。
問題文:開発者は、①インスタンス化できないShippingCalculatorクラスを作成する必要があり、②サブクラスがオーバーライドできるcalculateメソッドの③実用的なデフォルト実装を含める必要があります。 ShippingCalculatorクラスの正しい実装はどれですか。
- インスタンス化できない:
- この要件は、クラスが
abstract
であることを示しています。abstract
クラスは直接インスタンス化することができません。
- この要件は、クラスが
- サブクラスがオーバーライドできるcalculateメソッド:
- この要件は、
calculate
メソッドがvirtual
であることを示しています。virtual
キーワードは、このクラスが拡張や上書きを許可することを宣言します。よって、virtual
メソッドは、サブクラス(子クラス)でオーバーライド(上書き)することができます。
※クラスがvirtual
として定義されていない場合、override
キーワードを使用したメソッドの上書きはできません。
- この要件は、
- 実用的なデフォルト実装を含める:
- この要件は、
calculate
メソッドが具体的な実装内容(コードブロック)を持つことを示しています。abstract
クラスは、抽象メソッド(実装がないメソッド)を持つことができますが、この要件はcalculate
メソッドが具体的な実装を持つ必要があるため、calculate
メソッドはabstract
メソッドではなく、virtual
メソッドとして存在する必要があります。
- この要件は、
それぞれの選択肢の理由について説明します。
□ Public abstract class ShippingCalculator {
public override calculate() { /*implementation*/ }
}
これは不正解です。override
キーワードは、サブクラスで既存のvirtual
またはabstract
メソッドをオーバーライドするために使用されます。しかし、このクラスにはオーバーライドする元となるvirtual
またはabstract
メソッドが存在しません。また、calculate
メソッドの戻り値の型が指定されていません。
□ Public abstract class ShippingCalculator {
public virtual void calculate() { /*implementation*/ }
}
これは正解です。virtual
キーワードは、メソッドがサブクラスでオーバーライドされることを許可するために使用されます。この選択肢では、calculate
メソッドはデフォルトの実装を持ち、サブクラスでオーバーライドすることができます。
□ Public abstract class ShippingCalculator {
public abstract calculate() { /*implementation*/ }
}
これは不正解です。abstract
メソッドは実装(コードブロック)を持つことができません。この選択肢では、abstract
メソッドに具体的な実装が含まれているため、不正確です。また、calculate
メソッドの戻り値の型が指定されていません。
□ Public abstract class ShippingCalculator {
public void calculate() { /*implementation*/ }
}
これは不正解です。この選択肢のcalculate
メソッドは、サブクラスでオーバーライドすることができない普通のメソッドとして定義されています。オーバーライドを許可するためには、calculate
メソッドにvirtual
キーワードが必要です。
コメント