私は、同じパッケージ内で拡張する必要があるいくつかのクラスを持っています。しかし私は、私のクラスの外にいる誰かが私のクラスを拡張することを望んでいません。他のパッケージのクラスは私のクラスを呼び出すことができる必要がありますので、私は 'デフォルト'を使用できません。'default'を使用せずにパッケージに継承を制限できますか?
私はこれを達成できる方法はありますか?
私は、同じパッケージ内で拡張する必要があるいくつかのクラスを持っています。しかし私は、私のクラスの外にいる誰かが私のクラスを拡張することを望んでいません。他のパッケージのクラスは私のクラスを呼び出すことができる必要がありますので、私は 'デフォルト'を使用できません。'default'を使用せずにパッケージに継承を制限できますか?
私はこれを達成できる方法はありますか?
default
の可視性を持つ基本クラスを作成し、外部クラスから呼び出すことはできますが拡張はできないpublic final
クラスを使用して拡張します。例:あなたはあなたのコンストラクタパッケージがローカル作る場合
class MyBase {
public void doSomething() { ... }
}
public final class PublicBase extends MyBase { }
class ExtendedBase {
@Override
public void doSomething() { ... }
}
は、それだけで、それが公共のクラスであれば公共のメンバーは任意のクラスにアクセスすることができますが、同じパッケージに拡張することができます。
具体的な実装を返すクラスとファクトリクラスを使用するためのインタフェースを作成することができます。どちらもpublicであり、したがってパッケージの外側に表示されます。次に、デフォルトの可視性を持つ具象クラスを作成します。
これは、基底クラスをパッケージの外側から見えるようにするために最適なソリューションです。 – jzd
私のクラスをインスタンス化できるようにするには、他のパッケージのクラスが必要です。すべてのコンストラクターがそれを防ぐのではないでしょうか? – Florian
ファクトリメソッドを使用してインスタンス化できます。 –