0

多くのプロジェクトにプラグインできるツールキットとして使用している Java クラスのセットがあります。このツールキットのコードを変更したくないので、更新したりバグを修正したりするたびに、それを使用しているプロジェクトにドロップするだけで、ローカルの変更について心配する必要はありません。したがって、ローカル プロジェクトでツールキットのメソッドをオーバーライドする必要がある場合は、次のようにツールキット オブジェクトのローカル バージョンを作成するだけです。

ファイル: ツールキット/Dog()

public class Dog(){
  public void pet(){
    print("scratch ruff");
  }
}

ファイル: local/Dog()

public class Dog extends toolkit/Dog {
  public void pet(){
    print("rub ears");
  }
}

Dogまた、ローカル オブジェクトでは、ツールキット オブジェクトではなくローカル オブジェクトを参照しDogます。

これまでのところうまくいきましたが、問題が発生しました。ツールキットの別のクラスは を使用しDogます。

ファイル: ツールキット/DogHandler

public void careForPack( List<Dog> arg_allTheDogs ){
  for( Dog fido : arg_allTheDogs ){
    fido.pet();
  }
}

Dog発生する問題は、システムがこれらが同じオブジェクトではないことを好まないことです。ローカルでオーバーライドしたくありませんDogHandler。なぜなら、ツールキット全体をオーバーライドすることになり、目的が果たせなくなるからです。

がの子 ( とも呼ばれる) を有効であるDogHandlerと認識する方法はありますか?DogDog

4

2 に答える 2

4

ツールキット メソッドが、拡張Listする型の包含オブジェクトを受け入れるようにする必要があります。これに使用できます: toolkit.Dog? extends T

public void careForPack( List<? extends toolkit.Dog> arg_allTheDogs ){
  for( toolkit.Dog fido : arg_allTheDogs ){
    fido.pet();
  }
}
于 2013-01-25T17:34:58.017 に答える
0
public void careForPack( List<toolkit.Dog> arg_allTheDogs )
{
   for( local.package.name.Dog fido : arg_allTheDogs )
   {
       fido.pet();
   }
}

編集:多分これ?

//we need an interface to have datatype interchangability
public class Toolkit.Dog implements IToolkitDog
{
    public void pet()
    {
        print("toolkit dog says what");
    }
}

//we inherit the IToolkitDog from Toolkit.Dog
public class local.Dog extends Toolkit.Dog 
{
     public void pet()
     {
         print("rub ears");
     }
}


//both toolkit.dog and local.dog are of type IToolkitDog 
public void careForPack( List<IToolkitDog> arg_allTheDogs )
{
    for( local.Dog fido : arg_allTheDogs )
    {
       fido.pet();
    }
}

これはトリックを行うことができますか?

こんな感じになると思います

public interface IToolkitDog
{
     pet();
//...
}
于 2013-01-25T17:24:21.310 に答える