有一个类和一个子类以相同的方式处理?

时间:2012-02-02 04:36:44

标签: java

我有一个名为Image的类和一个名为ImageSheet的类。

ImageSheetImage相同,但它有其他字段,例如图片上的帧数。

我想要做的就是拥有它,以便我可以致电drawImage(img, frame)并让img成为ImageImageSheet,并使用相同的方法处理它们唯一的区别是,如果它是Image,那么frame字段将被忽略,但当它为ImageSheet时,frame字段将被读取并用于绘制特定帧。< / p>

我试图避免使用单独的方法,如果它是ImageImageSheet,因为我已经有3种不同的drawImage()方法接受不同的输入变量,如果我做了一个对于每个类,我有3对方法,其中每对基本上完全相同。

我怎样才能理解我的想法?

4 个答案:

答案 0 :(得分:1)

为什么不让Image / ImageSheet类自己处理帧处理?

例如,让Image类有一个名为process(frame)的方法,然后忽略发送的frame参数,让ImageSheet覆盖你想要的任何处理的进程(frame)方法要做的ImageSheet特定对象。

然后,您可以:

void drawImage(Image img, Frame frame) { img.process(frame); }

它将根据它是Image还是ImageSheet来做适当的事情。希望我能正确理解你的问题!

编辑:

澄清一下,分别是ImageImageSheet类的代码。

class Image {
  ... 
  public void process(Frame frame) { 
    // do something 
  }
}

class ImageSheet extends Image{
  ...
  // override process(Frame frame) method from Image
  public void process(Frame frame) { 
    // do something different 
  }
}

答案 1 :(得分:1)

由于ImageSheet扩展了图像,因此drawImage(img, frame)方法上的签名应为drawImage(Image img, Frame frame)。要区分ImageImageSheet个对象,请使用instanceOf运算符。 例如:

public void drawImage(Image img, Frame frame) {
  if(img instanceof ImageSheet) {
    // handle ImageSheet
  } else {
    // handle all other Image instances
  }
}

答案 2 :(得分:0)

我假设drawImage是Image / ImageSheet之外的方法,如果你想避免使用单独的方法,你可以使用instanceof并检查img参数是否是imageSheet的一个实例。

答案 3 :(得分:0)

据我了解,drawImage(...)方法在ImageImageSheet之外。在这种情况下,有许多潜在的解决方案:

  • (这可能有争议)Image所有效果都是ImageSheet,具有固定数量的帧(1);因此,您不必关心Image与众不同;
  • 如果此解决方案不合适,您可以使用双重调度,即让外部渲染器实体调用{{1}中声明的方法drawImage(frame)(以及可能的其他变体,我已经从您的文字中理解)每个子类中都存在类和类;这类似于Image模式。
  • 最后但并非最不重要的是,不要使用外部渲染器,而是让Visitor使用方法Image自行渲染,您可以在其中放置正在执行渲染的所有可能的功能请求。