2016-09-28 7 views
1

「インターフェイスはクラスのコントラクトです」という記事を読んでいます。 private、protected、publicの可視性を持つクラスの場合、なぜインタフェースはpublicメソッドのみを宣言しますか?インターフェイスでプライベート/プロテクトされた関数を宣言できません

+2

これは、常に公開されているインターフェイスを定義しています。内側のものがどのように機能するかは無関係です。 –

+0

[プライベート/保護されたメソッドを持つインターフェイスを使用することはできますか?](https://stackoverflow.com/questions/1876516/is-it-possible-to-have-an-interface-that-has) -private-protected-methods) – Duncanmoo

答えて

2

インターフェイスはオブジェクトとのやりとり方法(パブリックメソッド)を記述します。
インターフェイスは内部オブジェクト構造(プライベートまたは保護されたメソッド)について何も知らなくてはなりません
およびインターフェイスはオブジェクトのフードの下で何が起こっているか気にしません。

プライベートおよび保護された方法は、低レイヤーの実装によって異なります。

例えば、我々は、オブジェクトが情報を共有する方法を正確におよそインタフェースSocialMedia

interface SocialMedia 
{ 
    public function share(); 
} 

そして、このインタフェース内で、我々は気にしない(と気にする必要はありません)を持って、私たちは情報のみとなりますことを知っています共有。

そしてまた、我々は2つのクラスがあります:あなたはこのクラスを見ることができるように

class Twitter implements SocialMedia 
{ 
    private function tweet() 
    { 
    } 

    public function share() 
    { 
     return $this->tweet(); 
    } 
} 

class Facebook implements SocialMedia 
{ 
    private function post() 
    { 
    } 

    public function share() 
    { 
     return $this->post(); 
    } 
} 

SocialMediaを実装し、我々は彼らと対話する方法を知っている - まさにこれはインターフェースの意図です。
また、TwitterのプライベートメソッドtweetFacebookpostがあります。このメソッドは、特定のクラス内でのロー層実装なので、このメソッドをインターフェイス内に記述することはできません。

+0

+1基本的には、プライベートプロパティ/メソッドを出力するgetメソッドのように 'share'を使います。私は意味論的な理由から常にインターフェイスを使用してきました。 – Thielicious

2

公開 - 利用可能どこでも(他のクラス、オブジェクトのインスタンス);

保護 - 現在のクラスを拡張するクラスでのみ利用可能です。;

プライベート - 現在のクラスのでのみ利用可能です。

Reference

インタフェースは、「あなたはクラスの外から見ることができるもの」を意味するようになっています。 非公開メソッドを追加するのは意味がありません。

関連する問題