2011-08-09 10 views
7

私は、同じパッケージ内で拡張する必要があるいくつかのクラスを持っています。しかし私は、私のクラスの外にいる誰かが私のクラスを拡張することを望んでいません。他のパッケージのクラスは私のクラスを呼び出すことができる必要がありますので、私は 'デフォルト'を使用できません。'default'を使用せずにパッケージに継承を制限できますか?

私はこれを達成できる方法はありますか?

答えて

6

defaultの可視性を持つ基本クラスを作成し、外部クラスから呼び出すことはできますが拡張はできないpublic finalクラスを使用して拡張します。例:あなたはあなたのコンストラクタパッケージがローカル作る場合

class MyBase { 
    public void doSomething() { ... } 
} 

public final class PublicBase extends MyBase { } 

class ExtendedBase { 
    @Override 
    public void doSomething() { ... } 
} 
7

は、それだけで、それが公共のクラスであれば公共のメンバーは任意のクラスにアクセスすることができますが、同じパッケージに拡張することができます。

+2

これは、基底クラスをパッケージの外側から見えるようにするために最適なソリューションです。 – jzd

+0

私のクラスをインスタンス化できるようにするには、他のパッケージのクラスが必要です。すべてのコンストラクターがそれを防ぐのではないでしょうか? – Florian

+0

ファクトリメソッドを使用してインスタンス化できます。 –

0

具体的な実装を返すクラスとファクトリクラスを使用するためのインタフェースを作成することができます。どちらもpublicであり、したがってパッケージの外側に表示されます。次に、デフォルトの可視性を持つ具象クラスを作成します。

関連する問題