3

好的,我知道这个问题已经被问过几次了,但我需要关于我的具体案例的建议。有 Encodable 和 Decodable 之分,而 Message 既是 Encodable 又是 Decodable:

interface Encodable { void encode(); }
interface Decodable { void decode(); }
class Message implements Encodable, Decodable { ... }

void processEncodable(Encodable encodable) {
  ...
  encodable.encode();
  ...
}

除了Message,还有其他的Encodable(和Decodable),需要在processEncodable中处理。到目前为止一切顺利,但问题是我想从包外部隐藏 encode() 和 decode() ,并且 Java 接口不允许受保护/私有方法。有人可能会建议抽象类,但正如您所见,Message 应该同时继承 Encodable 和 Decodable,所以情况并非如此。有什么建议么?

这些天我非常喜欢 Scala,Scala 特征允许受保护/私有方法,恕我直言,这更直观。我已经经历了一些提到Java接口设计理念的答案,但我真的不明白为什么如果引入接口作为多重继承的替代方案,它为什么不应该允许受保护的方法,而抽象类则允许......

4

1 回答 1

1

作为替代品并不意味着它是完全替代品。接口是服务契约,因此它们将某个类提供给其客户的功能公开,作为任何可以访问该接口的客户。

如果您想从包外部隐藏(这意味着您的逻辑也应该与类一起保留在包中encode)不要通过接口公开它们,而是允许它们成为(或包私有)您的方法类(或超类,如果各种类都是可编码/可解码的)。decodeMessageprotectedMessage

这不是一个孤立的规则。有一些机制可以在不破坏接口概念的情况下实现你想要的。想一想:如果您只能在包中访问该方法,那么该方法对接口有什么好处?如果它们可以是类方法,那么在接口中拥有这样的方法又有什么意义呢?这些方法也可用于具有适当修饰符的包的成员?

于 2013-04-15T18:20:45.500 回答