4

Lib直接変更できない既存のライブラリを拡張しています (それを と呼びましょう)。

一部のメソッドをLibプライベートから作成して、サブクラスの外部からアクセスできないようにする方法はありますか?

たとえば、私が持っている場合:

class A extends Lib {
    def fun(i: int) = someLibFunction(i) //someLibFunction is inherited from Lib
} 

someLibFunctionLibで公開/保護されているにもかかわらず、Aで非公開にするにはどうすればよいですか?

4

2 に答える 2

11

これは、オブジェクト指向プログラミングの基本的な基盤、つまりスーパークラスが期待される場所ならどこでもサブクラスを使用できる (ポリモーフィズム) を壊します。

メソッドの可視性を絞り込むことが許可されている場合 (例: from publicto private) のインスタンスを受け取るクライアント コードはLib、 receive を許可されませんA extends Lib。クライアント コードはsomeLibFunction()アクセス可能であることが想定されており、サブクラスはそのコントラクトを変更できません。

とはいえ、Scala もオブジェクト指向言語も、サブクラス化時にメソッドの可視性を絞り込むことは許可されていません。可視性を広げることに注意してください (たとえば、from protectedtopublicは完全に可能です)。

つまり、既存の API (ライブラリ)を拡張していません。異なるコントラクトを持つ完全に異なる API (ライブラリ) を作成しています。

最後の例:と canVehicleを持つクラスがあります。のようないくつかの新しい機能を追加することで拡張できます。ただし、運転能力を拡張および非表示にすることはできません。は含むことができ(またはその逆)、 のような共通の親を持つこともできます。capacity()drive()CarVehiclerefuel()ContainerVehicleContainer VehicleContainerVehicleCanHoldCargo

于 2012-06-07T21:06:33.437 に答える