2

他のプログラマーが私のサービスを使用するときに実装名とクラス名が不要になるように、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、ジェネリックスが残りを実行してもらいたいだけです。

4

2 に答える 2

4

抽象ファクトリパターンを使用する必要があります。つまり、可能なすべてのサブクラスを認識し、のサブクラスであるオブジェクトまたはaがItemService与えられると、正しいサブクラスのインスタンスを返す静的メソッドが必要になります。言い換えれば、ItemClassUserItemService

public static ItemService<?> instance(Class<? extends User> c) {
    if (c == Customer.class)
        return new CustomerItemService();
    else if (c == Employee.class)
        return new EmployeeItemService();
    ...
}

その後、あなたは言うことができます

ItemService<?> service = ItemService.instance(Customer.class);

または、マップを作成することもできます。

Map<Class<? extends User>, Class<? extends ItemService>> services = 
    new HashMap<Class<? extends User>, Class<? extends ItemService>>() {{
    put(Customer.class, CustomerItemService.class);
    put(Employee.class, EmployeeItemService.class);
    // more...
}};

その後、instance()次のようになります

ItemService<? extends User> instance(Class<? extends User> c) {
    return services.get(c);
}
于 2012-05-22T13:48:59.640 に答える
0

コードは正常に機能します。ItemServiceのインスタンスを作成します。

Item item = new ItemService<Company>(company);

を呼び出すと、ItemServiceのbelongsToUser()メソッドが呼び出されます。CompanyItemServiceのインスタンスを作成して、メソッドを呼び出す必要があります。

于 2012-05-22T13:56:56.380 に答える