他のプログラマーが私のサービスを使用するときに実装名とクラス名が不要になるように、APIを作成しようとしています。このサービスは「アイテム」に対してさまざまな操作を実行しますが、サービスがアイテムの要求を処理する方法の主な要因は、ユーザータイプに基づいています。これまでのところ、インターフェイス(Item
)と実装サービス(ItemService
)、そしてこれから拡張するいくつかのユーザータイプクラス(例CompanyItemService
)があります。ユーザータイプには、スーパークラスが次のUser
ようなサブクラスである構造もありCompany
ます。
public class ItemService<T extends User> extends Item {
User user;
public ItemService(User user) {
this.user = user;
}
@Override
public boolean belongsToUser() {
//Check all records
}
}
public class CompanyItemService<T extends Company> extends ItemService<Company> {
public CompanyItemService(Company user) {
super(user);
}
@Override
public boolean belongsToUser() {
//Check company specific records
}
}
public class User {
//Common user stuff
}
public class Company extends User {
//Company specific stuff
}
だから私は次のような電話で私のサービスを利用できるようにしたいと思っています:
User company = new Company();
//stuff
Item item = new ItemService<Company>(company)
item.belongsToUser();
ただし、これを行うItemService
と、のオーバーライドメソッドの代わりにgetsのメソッドが呼び出されますCompanyItemService
。クラスに属していることを知らなくても、このオーバーライドメソッドを取得することは可能CompanyItemService
ですか?
乾杯、
アレクセイブルー。
これらすべての一般的な考え方は、別のユーザータイプが発明されたときに、必要に応じて既存のコードを変更せずに別のユーザー固有のサービスを追加できるというものです。また、ユーザータイプがたくさんある場合は、APIを使用しているユーザーに、覚えておいてもらいItemService
、ジェネリックスが残りを実行してもらいたいだけです。