問題タブ [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.
c# - 派生型を返す派生インターフェイスでプロパティを非表示にすることは許容されますか?
TL;DR
元のプロパティの派生型を返すように宣言を変更できるように、インターフェイスでプロパティを非表示にすることの何が問題になっていますか?
これは以前に尋ねられたにちがいないと確信していますが、見つけることができず、長い質問をお詫びします。
この状況があるとします:
MoreSpecificA
のユーザーが である B にアクセスできるようにしたいと思いますMoreSpecificB
。呼び出しTheB
てキャストするか、メソッドを呼び出すことでこれを行うことができますTheMoreSpecificB
。MoreSpecificA
次のように宣言することもできます。
これで、同じメソッドを使用してMoreSpecificB
.
を使用しnew
てメソッドを非表示にすると歯が立たなくなりますが、なぜこれが悪い考えなのですか? ここで行うのは合理的なことのようです。
これについて私が見たほとんどの場合の一般的な提案は、代わりにジェネリックを使用することのようですが、これには問題があるようですMoreSpecificA
。インスタンスにアクセスするときにあいまいさを与える拡張を行うには、A
必要MoreSpecificA
かどうかがわからないためですA
TheB
MoreSpecificA
A.TheB
MoreSpecificA.TheB
これは、MoreSpecificA で新しい TheB を宣言することで解決できます (ただし、再び新しい問題が発生します)。
MoreSpecificA が A を拡張しない場合、blah
上記のクラスの最初のメソッドは、MoreSpcificA を A に変換できないため、エラーになります。
これを書いているときに、 BaseA を次のように反変であると宣言すると、次のようになることに気付きました。
そして私のクラスは
それから私は両方の長所を得る. このソリューションの適用可能性は、A
に何かを追加するかどうかによって異なりますABase
か?
それとも、元のメソッドの派生型を返すために派生型のメソッドを非表示にするという当初の計画は大丈夫ですか?
java - Java のオーバーライドと非表示 - 混乱
Java でのオーバーライドと非表示の違いについて、私は混乱しています。これらがどのように異なるかについて、誰でも詳細を提供できますか? Java チュートリアルを読みましたが、サンプル コードは依然として混乱を招きました。
より明確にするために、私はオーバーライドをよく理解しています。私の問題は、一方がインスタンス レベルにあり、もう一方がクラス レベルにあるという事実を除いて、非表示がどのように違うのかがわからないことです。
Java チュートリアル コードを見ると、次のようになります。
次に、サブクラスがありCat
ます。
それから彼らは言う:
このプログラムの出力は次のとおりです。
アニマルのクラスメソッド。
Cat のインスタンス メソッド。
私にとって、クラス メソッドをクラスtestClassMethod()
から直接呼び出すとクラスAnimal
内でメソッドが実行されるという事実Animal
は明らかであり、特別なことは何もありません。testInstanceMethod()
次に、 への参照からを呼び出すmyCat
ので、そのときに実行されたメソッドが のインスタンス内のものであることは明らかですCat
。
私が見たところ、呼び出しの非表示はオーバーライドと同じように動作しますが、なぜその区別をするのでしょうか? 上記のクラスを使用してこのコードを実行すると:
取得します:
Cat のクラス メソッド。
しかし、Cat から を削除すると、次のtestClassMethod()
ようになります
。 Animal のクラス メソッド。
これは、親と同じシグネチャを持つ静的メソッドをサブクラスに記述すると、オーバーライドがほとんど行われることを示しています。
うまくいけば、私が混乱している場所を明確にし、誰かが光を当てることができます. よろしくお願いします!
java - Java でのメソッドの隠蔽
重複の可能性:
Java のオーバーライドと非表示 - 混乱
Java でのメソッドの非表示と、メソッドの非表示を使用する理由を説明してもらえますか?
Oracleのチュートリアルを読んだのですが、理解できませんでした。
c# - C#: wcf インターフェイスとして機能するインターフェイスを別のインターフェイスに継承する
これに関連するいくつかの質問をしましたが、まだ決定的な回答が得られていないため、ここでより簡単な質問をします。
このことを考慮。私は2つのインターフェースを持っています。1 つは dao について説明します。1 つは wcf インターフェイスです。wcf インターフェースは、そのメソッドを wcf 属性で公開するために dao インターフェースを継承します。これは wcf インターフェースであるため、[OperationContract] などの wcf 属性を配置するために、メソッドを再度宣言する必要があります。その結果、以前のインターフェイス メソッドを事実上隠しており、それらに「new」キーワードを配置する必要があります。これは、この状況で行う正しいことですか。wcf インターフェイスを介して dao インターフェイス メソッドを提示できるようにする必要があるため、それを継承する必要があります。これらの関数を公開するように wcf インターフェイスを強制したいと考えています。私の手はかなり縛られており、メソッドを公開するためにこのアプローチを使用する必要があるようですが、どう思いますか?
コード的には、次のようになります。
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>
ます。どうすればこれまたは同様のことを達成できますか? これを克服するための設計上のアドバイスもいいでしょう。
c++ - 名前空間内の関数のシャドウイング
次のコードがあるとします
void f(int){}
名前空間aで定義されている場合(3行目はコメントされていません)、以降のvoid f(b::T){}
andの定義をシャドウしますが、。はシャドウしvoid f(a::S){}
ませんvoid f(X){}
。なんで?
java - Java でメソッドを非表示にする利点
Java のメソッド非表示の概念について読んだことがありますが、その利点を理解しているかどうかはわかりません。メソッドの隠蔽はどのような場合に役立ちますか?
c# - メソッドのオーバーライドと非表示の実行フロー
私は次のシナリオと混同しています、私たちはこのようなクラスのセットを持っています
次のメソッドを呼び出すと
このような出力が得られます
BBDD
宣言された型のメソッドではなく、継承されたメソッドが呼び出されるのはなぜですか。また、クラスのメソッドがD
毎回呼び出されないのはなぜですか。
java - java非静的から静的メソッド-非表示またはオーバーライド
サブクラスの非静的メソッドを、静的なオーバーライドまたは非表示と同じもので再定義していますか?
http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.htmlは非表示と言っています。しかし、スーパークラスメソッドをfinalとして宣言すると、オーバーライドエラーが発生します。
スーパークラス宣言は
サブクラス:
オーバーライドエラーが発生します。
java - ベースの再描画メソッドを呼び出していますか?
私は2つのクラスを持っています:
簡単な検索で、基本クラスから基本オーバーライドされたメソッドを呼び出す方法がないことがわかりました。問題は、repaint
A 内で A のメソッドをどのように呼び出すことができるかということです。ここで説明されているように、基本メソッドを作成し、明示的に拡張する別のメソッドを作成できることはわかっていますが、Java 設計パターンに従うためにすべての子に共通する必要があるメソッドであるため、最も何よりも重要なことは、別のプログラマーが私の仕事を続けている場合、彼は再描画メソッドを探しているでしょう.これを行うための提案はありますか?
編集:申し訳ありませんが、クラス A が抽象であることを忘れていたので、A のすべてのインスタンスも B です (想像してください、A クラスの子がもっとあるので、B で完全に実装することはできません。 A のすべての子でその動作が必要なため)、また、実行の特定の部分で A のビューを更新する必要があるため、これが必要ですが、A のものを更新せずに A のそれぞれの部分をペイントしたいだけです子どもたち。