問題タブ [method-hiding]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
99 参照

c# - 派生型を返す派生インターフェイスでプロパティを非表示にすることは許容されますか?

TL;DR

元のプロパティの派生型を返すように宣言を変更できるように、インターフェイスでプロパティを非表示にすることの何が問題になっていますか?

これは以前に尋ねられたにちがいないと確信していますが、見つけることができず、長い質問をお詫びします。

この状況があるとします:

MoreSpecificAのユーザーが である B にアクセスできるようにしたいと思いますMoreSpecificB。呼び出しTheBてキャストするか、メソッドを呼び出すことでこれを行うことができますTheMoreSpecificBMoreSpecificA次のように宣言することもできます。

これで、同じメソッドを使用してMoreSpecificB.

を使用しnewてメソッドを非表示にすると歯が立たなくなりますが、なぜこれが悪い考えなのですか? ここで行うのは合理的なことのようです。

これについて私が見たほとんどの場合の一般的な提案は、代わりにジェネリックを使用することのようですが、これには問題があるようですMoreSpecificA。インスタンスにアクセスするときにあいまいさを与える拡張を行うには、A必要MoreSpecificAかどうかがわからないためですATheBMoreSpecificAA.TheBMoreSpecificA.TheB

これは、MoreSpecificA で新しい TheB を宣言することで解決できます (ただし、再び新しい問題が発生します)。

MoreSpecificA が A を拡張しない場合、blah上記のクラスの最初のメソッドは、MoreSpcificA を A に変換できないため、エラーになります。

これを書いているときに、 BaseA を次のように反変であると宣言すると、次のようになることに気付きました。

そして私のクラスは

それから私は両方の長所を得る. このソリューションの適用可能性は、Aに何かを追加するかどうかによって異なりますABaseか?

それとも、元のメソッドの派生型を返すために派生型のメソッドを非表示にするという当初の計画は大丈夫ですか?

0 投票する
17 に答える
50982 参照

java - Java のオーバーライドと非表示 - 混乱

Java でのオーバーライドと非表示の違いについて、私は混乱しています。これらがどのように異なるかについて、誰でも詳細を提供できますか? Java チュートリアルを読みましたが、サンプル コードは依然として混乱を招きました。

より明確にするために、私はオーバーライドをよく理解しています。私の問題は、一方がインスタンス レベルにあり、もう一方がクラス レベルにあるという事実を除いて、非表示がどのように違うのかがわからないことです。

Java チュートリアル コードを見ると、次のようになります。

次に、サブクラスがありCatます。

それから彼らは言う:

このプログラムの出力は次のとおりです。

アニマルのクラスメソッド。

Cat のインスタンス メソッド。

私にとって、クラス メソッドをクラスtestClassMethod()から直接呼び出すとクラスAnimal内でメソッドが実行されるという事実Animalは明らかであり、特別なことは何もありません。testInstanceMethod()次に、 への参照からを呼び出すmyCatので、そのときに実行されたメソッドが のインスタンス内のものであることは明らかですCat

私が見たところ、呼び出しの非表示はオーバーライドと同じように動作しますが、なぜその区別をするのでしょうか? 上記のクラスを使用してこのコードを実行すると:

取得します: Cat のクラス メソッド。 しかし、Cat から を削除すると、次のtestClassMethod()ようになります 。 Animal のクラス メソッド。

これは、親と同じシグネチャを持つ静的メソッドをサブクラスに記述すると、オーバーライドがほとんど行われることを示しています。

うまくいけば、私が混乱している場所を明確にし、誰かが光を当てることができます. よろしくお願いします!

0 投票する
1 に答える
2312 参照

java - Java でのメソッドの隠蔽

重複の可能性:
Java のオーバーライドと非表示 - 混乱

Java でのメソッドの非表示と、メソッドの非表示を使用する理由を説明してもらえますか?

Oracleのチュートリアルを読んだのですが、理解できませんでした。

0 投票する
1 に答える
1074 参照

c# - C#: wcf インターフェイスとして機能するインターフェイスを別のインターフェイスに継承する

これに関連するいくつかの質問をしましたが、まだ決定的な回答が得られていないため、ここでより簡単な質問をします。

このことを考慮。私は2つのインターフェースを持っています。1 つは dao について説明します。1 つは wcf インターフェイスです。wcf インターフェースは、そのメソッドを wcf 属性で公開するために dao インターフェースを継承します。これは wcf インターフェースであるため、[OperationContract] などの wcf 属性を配置するために、メソッドを再度宣言する必要があります。その結果、以前のインターフェイス メソッドを事実上隠しており、それらに「new」キーワードを配置する必要があります。これは、この状況で行う正しいことですか。wcf インターフェイスを介して dao インターフェイス メソッドを提示できるようにする必要があるため、それを継承する必要があります。これらの関数を公開するように wcf インターフェイスを強制したいと考えています。私の手はかなり縛られており、メソッドを公開するためにこのアプローチを使用する必要があるようですが、どう思いますか?

コード的には、次のようになります。

0 投票する
2 に答える
1673 参照

c# - ジェネリック派生クラスで基本クラス メソッドを非表示にする

次のような基本クラスがあります。

そして、このような子クラス:

ユーザーがFoo<string>「fooString」というオブジェクトを作成すると、両方を呼び出すことができますfooString.Do(5)が、「fooInt」fooString.Do("test")というオブジェクトを作成するFoo<int>と、派生クラスの Do メソッドしか呼び出すことができません。私はそれが何であれ、2番目を好みTます。

これら両方のクラスの Do メソッドは、基本的に同じことを行います。派生クラスのものは、指定されたパラメーターを使用して から整数を取得し、Dictionary<T, int>それを使用して基本クラスの Do メソッドを呼び出します。

FooBaseそのため、 inの Do メソッドを非表示にしたいと考えていFoo<T>ます。どうすればこれまたは同様のことを達成できますか? これを克服するための設計上のアドバイスもいいでしょう。

0 投票する
1 に答える
886 参照

c++ - 名前空間内の関数のシャドウイング

次のコードがあるとします

void f(int){}名前空間aで定義されている場合(3行目はコメントされていません)、以降のvoid f(b::T){}andの定義をシャドウしますが、。はシャドウしvoid f(a::S){}ませんvoid f(X){}。なんで?

0 投票する
2 に答える
2304 参照

java - Java でメソッドを非表示にする利点

Java のメソッド非表示の概念について読んだことがありますが、その利点を理解しているかどうかはわかりません。メソッドの隠蔽はどのような場合に役立ちますか?

0 投票する
3 に答える
816 参照

c# - メソッドのオーバーライドと非表示の実行フロー

私は次のシナリオと混同しています、私たちはこのようなクラスのセットを持っています

次のメソッドを呼び出すと

このような出力が得られます

BBDD

宣言された型のメソッドではなく、継承されたメソッドが呼び出されるのはなぜですか。また、クラスのメソッドがD毎回呼び出されないのはなぜですか。

0 投票する
5 に答える
6534 参照

java - java非静的から静的メソッド-非表示またはオーバーライド

サブクラスの非静的メソッドを、静的なオーバーライドまたは非表示と同じもので再定義していますか?

http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.htmlは非表示と言っています。しかし、スーパークラスメソッドをfinalとして宣言すると、オーバーライドエラーが発生します。

スーパークラス宣言は

サブクラス:

オーバーライドエラーが発生します。

0 投票する
3 に答える
1359 参照

java - ベースの再描画メソッドを呼び出していますか?

私は2つのクラスを持っています:

簡単な検索で、基本クラスから基本オーバーライドされたメソッドを呼び出す方法がないことがわかりました。問題は、repaintA 内で A のメソッドをどのように呼び出すことができるかということです。ここで説明されているように、基本メソッドを作成し、明示的に拡張する別のメソッドを作成できることはわかっていますが、Java 設計パターンに従うためにすべての子に共通する必要があるメソッドであるため、最も何よりも重要なことは、別のプログラマーが私の仕事を続けている場合、彼は再描画メソッドを探しているでしょう.これを行うための提案はありますか?

編集:申し訳ありませんが、クラス A が抽象であることを忘れていたので、A のすべてのインスタンスも B です (想像してください、A クラスの子がもっとあるので、B で完全に実装することはできません。 A のすべての子でその動作が必要なため)、また、実行の特定の部分で A のビューを更新する必要があるため、これが必要ですが、A のものを更新せずに A のそれぞれの部分をペイントしたいだけです子どもたち。