メソッドの型指定(回答)

答え

  • C

public static void Save<T>(T user) where T: User, new() {
...
}

解説

この問題では、Saveメソッドは、UserクラスもしくはUserクラスを継承したクラスのいずれかがパラメータに渡すことができるメソッドであることが条件から分かります。

そのような任意のクラスを受け付けるメソッドとして、「ジェネリック メソッド」というものがあります。

public static void Save<T>(T user) {
...
}

特徴としては、メソッド名の後ろに <T> という個所があり、引数にも T が使用されています。

呼出元が <T> の箇所に例えば <User> と指定することによって T = User と置き換えて処理を行うことができます。

つまり、以下のようなメソッドに置き換わるわけです。

public static void Save(User user) {
...
}

しかし、これではUserクラス以外でも指定できてしまいます。

そこで、指定できるクラスを制約する方法として、「型パラメータの制約」というものがあります。

public static void Save<T>(T user) where T: User {
...
}

メソッドのパラメータ指定の後ろに追加された where T: User という部分が制約です。

ここでは、「Tは、Userクラスが基底クラスであるか、そのクラスから派生していること」が制約の内容になります。

しかし、これでは条件のうち、「Userクラスから継承されたクラスは、パラメータなしのコンストラクターを使用するクラスのみ許されなければなりません。」という条件を満たすことができません。

そのため、この条件を制約する方法として、「new制約」というものがあります。

public static void Save<T>(T user) where T: User, new() {
...
}

先ほどの型パラメータの制約に、カンマ区切りに続いて new() が追加されました。

これによって、「Tは、Userクラスが基底クラスであるか、そのクラスから派生していること。また、パブリックでパラメータなしのコンストラクターが必要である。」が制約の内容になります。

しかし、選択肢を見ると「new(), User」と「User, new()」の2つのパターンが存在しています。

new制約とほかの制約を併用する場合は、new制約を最後に指定する必要があります。

そのため、正解は「User, new()」ですので注意してください。

参考