これは、オブジェクト指向プログラミングの基本的な基盤、つまりスーパークラスが期待される場所ならどこでもサブクラスを使用できる (ポリモーフィズム) を壊します。
メソッドの可視性を絞り込むことが許可されている場合 (例: from public
to private
) のインスタンスを受け取るクライアント コードはLib
、 receive を許可されませんA extends Lib
。クライアント コードはsomeLibFunction()
アクセス可能であることが想定されており、サブクラスはそのコントラクトを変更できません。
とはいえ、Scala もオブジェクト指向言語も、サブクラス化時にメソッドの可視性を絞り込むことは許可されていません。可視性を広げることに注意してください (たとえば、from protected
topublic
は完全に可能です)。
つまり、既存の API (ライブラリ)を拡張していません。異なるコントラクトを持つ完全に異なる API (ライブラリ) を作成しています。
最後の例:と canVehicle
を持つクラスがあります。のようないくつかの新しい機能を追加することで拡張できます。ただし、運転能力を拡張および非表示にすることはできません。は含むことができ(またはその逆)、 のような共通の親を持つこともできます。capacity()
drive()
Car
Vehicle
refuel()
Container
Vehicle
Container
Vehicle
Container
Vehicle
CanHoldCargo