3

この質問が何度か聞かれたことは知っていますが、私の特定のケースについてアドバイスが必要です。エンコード可能とデコード可能があり、メッセージはエンコード可能とデコード可能の両方です。

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パッケージの外側から非表示にしたい場合(decodeつまり、ロジックもMessageクラスと共にパッケージ内にとどまる必要があることを意味します)、インターフェイスを介してそれらを公開しないください。クラス (または、さまざまなクラスがエンコード可能/デコード可能である場合はスーパークラス)。protectedMessage

これは孤立したルールではありません。インターフェイスの概念を壊すことなく、目的を達成するためのメカニズムがあります。これについて考えてみてください:パッケージ内でのみアクセスできる場合、そのメソッドはインターフェースに対して何の役に立つでしょうか? 適切な修飾子を使用してパッケージのメンバーも利用できるクラスメソッドである場合、インターフェイスにそのようなメソッドを含める意味は何ですか?

于 2013-04-15T18:20:45.500 に答える