問題
開発者は、インスタンス化できない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キーワードが必要です。
次の問題へ

前の問題へ

1問目から復習する


コメント