2

オーバーロードされたインターフェイス メソッドを実現しようとしています。これが Java では機能しないことはわかっていますが、action()メソッドに型ではなく実装型を含めるには、次のように書き直すにはどうすればよいBaseでしょうか?

class Base;
class Foo extends Base;
class Bar extends Base;

interface IService {
   void action(Base base);
}

class FooService implements IService {
   void action(Foo foo) {
     //executes specific foo action
   }
}

class BarService implements IService {
   void action(Bar bar) {
     //executes specific Bar action
   }
}

利用方法:

Base base; //may be foo or bar
anyService.action(bar);

あなたはアイデアを得る。どうすればこれを行うことができますか?

4

5 に答える 5

1

使用目的に応じて、試してみるべきことがいくつかあります。

IService への呼び出しで取得できるオブジェクトの種類がわかっている場合は、ジェネリックを試すことができます。

interface IService<T extends Base> {
   void action(T foo)
}

と使用法:

IService<Foo> fooService = ...
fooService.action(fooObject);

そうでない場合は、「Base」クラスをチェックして、IService インターフェイスを区別できるようにすることができます。

class Base {
   boolean acceptsFoo();
   boolean acceptsBar();
}

次のように使用できます。

class AnyService implements IService {
   void action(Base base) {
     if (base.acceptsFoo()) {
        ((FooService) base).foo();
     }
}

しかし、これは奇妙なデザインのようです。インターフェイスは均一なアクセスを提供することを目的としています。引数を区別する必要がある場合、これはほとんどの場合、いくつかの部分に分割できるインターフェイスの兆候です...

于 2013-04-01T11:13:39.300 に答える
1

Fooと の両方を実装する必要があるインターフェイスを定義すると、次のBarように実行できます。

interface Actionable{
    public void action;
}

class Base;
class Foo extends Base implements Actionable;
class Bar extends Base implements Actionable;

interface IService {
   void action(Actionable a);
}

class FooService implements IService {
   void action(Actionable a) {
    ...
   }
}

class BarService implements IService {
   void action(Actionable a) {
    ...
   }
}

いずれにせよ、インターフェイスはコードをより堅牢で再利用可能にする必要があります。それらを機能させるためのハックを検討している場合は、アプリケーションをより適切に設計することを検討してください。

于 2013-04-01T11:14:10.210 に答える
1

これは Java ではサポートされておらず、OOP ルールに違反しています。

于 2013-04-01T11:08:01.457 に答える
-1

そのアクションを実行するために、いつでも特定の型に型キャストできます。

void action(Base base) 
{
    if(base instanceof Foo)
    {
         Foo foo = (Foo) base;
         //executes specific foo action
    }
    else
    {
        // handle the edge case where the wrong type was sent to you
    } 
}
于 2013-04-01T11:06:14.240 に答える