如何使用子对象,就好像它是父对象一样?

时间:2013-01-25 17:20:56

标签: java

我有一组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

FILE:toolkit / DogHandler

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

出现的问题是系统不喜欢这些Dog对象不同。我不想在本地覆盖DogHandler,因为我最终会覆盖我的整个工具包,而这会违背目的。

DogHandler是否有办法识别Dog的孩子(也称为Dog)是否有效?

2 个答案:

答案 0 :(得分:4)

您应该让您的工具包方法接受包含扩展 List类型的对象的toolkit.Dog。您可以使用? extends T

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

答案 1 :(得分: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();
//...
}