2010-03-03 73 views
1

因此,这里是我的问题:专用接口或抽象类:什么是我的选择

我用在我的项目的一些接口,以帮助保持良好的编码风格,但是,我的软件设计建议我可能能够将其导出为我和其他人可以使用的库。

问题在于可访问性。在我的一些接口中,我不希望别人访问这些方法,但是Java强制它们公开。这在我自己的项目中是可以的,但我不希望其他人能够访问这些方法。

例如,我已经叫一个接口雪碧一些方法如下

Sprite: 
void update(Room room); 
void draw(Room world, Canvas c); 
void updateHealth(); 
void updateLocation(Room room); 
int getLayer(); 
void shoot(); 
void setDirection(Direction direction); 
... 

这是一件好事,因为所有的精灵需要这些方法,但他们中的一些,如抽奖()我只希望我的游戏引擎使用。

我有什么选择?

+0

专用接口是没有意义的,接口用于通信的API。因此编译器拒绝它。 – 2010-03-03 15:29:59

回答

4

我会说,缩小界面Spirte并将您想要的方法private移动到AbstractSprite子类。这是最简单的方法。

0

抽象类应该是罚款,如果:

  • 可以有一些共同的实现(即使它是一个非常简单的像一些属性)
  • 你必须定义这些保护方法
  • 和你的东西是对象(is-a relationship)的同类。你说的是“我所有的精灵”,所以你在说:“所有的都是一些子类型的精灵”。

因此......就你而言,抽象类似乎很适合。

不要害怕。如果你需要接口,你也可以稍后定义它们(甚至是抽象类实现一个方法子集的接口)。

或者如果您需要更改,您可以重构。

0

怎么样创建(或多个)Facade

如果你有更大的类/接口在你的库中一起播放,那么Facade提供了一个受控的“界面”给外部世界。更具体地说,对于你的Sprite,你可以将你的界面分成两个界面:一个通过你的Facade可用于外界,但不包括draw()之类的界面。而像你的内部使用DrawableSprite。那么你的内部对象当然会实现这两个接口。

0

Java允许4级访问私有,受保护,公共和默认。 (默认是没有关键字)果壳中的Java将其称为默认Sun java tutorial也说包私有

默认允许从同一包中的类访问。

所以在这种情况下,只有你应该访问的接口是默认的,所以不能从你的包外看到。

对于雪碧,你需要分成2个接口 公共雪碧含有外部代码可以使用的。 默认只对游戏引擎

的您为通过游戏引擎的使用可以扩展两个接口对象,