【发布时间】:2013-04-07 23:10:30
【问题描述】:
好的,我知道这个问题已被问过几次,但我需要针对我的具体案例的建议。有 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 接口设计理念的答案,但我真的不明白为什么如果引入接口作为多重继承的替代方案,它为什么不应该允许受保护的方法,而抽象类则允许......
【问题讨论】:
-
为什么您认为您的案例的答案与您已经提到的您已阅读的答案不同? stackoverflow.com/questions/5376970/protected-in-interfaces
-
没错。不要尝试以非设计方式使用接口。
-
@atk:因为那里的答案对我没有太大帮助。它只说“Java就是这样”。另外,是的,“接口应该意味着您可以从类外部看到的内容”,但为什么不在类外部而仅在包内部,就像抽象类支持一样?
-
我认为问题必须是让
Encodable.encode()返回Encodable是否是个好主意。仅当您想对某些内容进行两次编码时,这才有意义。如果Encodable.encode()返回一个Decodable和Decodable.decode()一个Encodable,这不是更有意义吗?至少我会期望一些被编码的东西是可解码的。
标签: java oop access-modifiers