0

我有一组 Java 类用作工具包,可以插入到许多项目中。我不想更改此工具包中的代码,因此每当我更新它或修复错误时,我都可以将其放入正在使用它的任何项目中,而无需担心本地更改。因此,如果任何本地项目需要覆盖工具包中的方法,我只需制作工具包对象的本地版本,如下所示:

文件:工具包/狗()

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

文件:本地/狗()

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 回答