0

プログラミング言語では、子オブジェクトが親の代替として動作するようにする場合は、それ自身のID(子供の)を失ってはいけませんが、親の許可が必要です。それがC#やC++で仮想メソッドを仮想化する理由です。そして、これは完全な隠れになります。完全な隠れはJavaでオーバーライドと見なされますか?私はそれが隠れていると思っていると思うので、私は間違ったコンセプトを持っています。オーバーライドされた関数は、JAVAだけが関わっ​​ているように、完全に隠すことができますか?Liskovの置換の原理は、Javaのオーバーライドにどのように関係していますか?完全なヒディングとオーバーライドの違いは何ですか?

+0

[C#とJavaで仮想関数はどのように機能しますか?](http://stackoverflow.com/questions/460446/how-do-virtual-functions-work-in-c-sharp-and-java) ) –

+0

いいえ、私はC#またはC++で仮想を実装するのが純粋な方法であるかどうかを知りたいのですか? –

答えて

0

リスキーオフの置換の原則は、具体的な子実装ではなく、抽象的な親実装を返す関数にリンクされています。 GetListの方法は具体的リストの実装を返す最初のケースでは、上記の例では第2の場合の例

ArrayList getList vs List getList 

ためGETLIST方法は、Listインタフェースのインスタンスを返します。今度はリスコフの置換の原則に従って、2番目のメソッドをサブクラスでオーバーライドしてListの異なる具体的な実装を返すことができるので、2番目のアプローチを使用する必要がありますが、最初はArrayListのサブクラスのArrayListのみが返されます。したがって、最初のケースは2番目のケースよりも抽象的ではなく、リスコフの置換原理に従って、親の実装は、必要なだけ自由に実装できるようにできるだけ抽象的でなければなりません。

メソッド隠蔽については、静的メソッドでのみ可能です。 Javaでオーバーライドしても、インスタンスレベル以降のメソッドは非表示になりません。しかし、静的メソッドの場合、メソッドはクラスレベルであるため、多態性は不可能です。したがって、サブクラスが同じ名前、引数、戻り値の型を持つ静的メソッドを作成し、そのメソッドに静的にアクセスしようとすると、クラスのバージョンが呼び出され、スーパークラスのバージョンではなく、サブクラスがスーパークラスからメソッドを非効率的に隠してしまったためです。

関連する問題