問題タブ [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# - C#で親メソッドからすべてのオーバーライドを非表示にする方法
外部から呼び出したくないパブリックメソッドを持つライブラリクラスを拡張しています。「new」キーワードを使用して非表示にできることはわかっていますが、問題は、さまざまな宣言がたくさんあることです。このようなもの:
今私はできる:
しかし、その関数のすべてのオーバーライドを非公開にする簡単な方法がないかどうか疑問に思っています。
objective-c - GCDdispatch_asyncブロック内からsuperを呼び出す:安全ですか?
私は少し漬け物になっています。ブロック内から[selfmethodName]を呼び出すと、保持サイクルが発生することを知っています。
ただし、このクラスではマルチスレッドが原因で、ブロックがアクセスしているメソッドをブロック以外の場所から実行することを許可できません。重大な問題が発生する可能性があるためです。
現在のコード:
まさにそれを行い、[selfgetmethod]を呼び出します。ディスパッチされたブロックがこのメソッドを実行することは問題ありませんが、このクラスの外部でこのメソッドを呼び出すことは望ましくありません。したがって、この継承されたメソッドをそのままオーバーライドしても問題ありません。
次に、ブロックを次のように変更します。
私はそれを試しましたが、[self getMethod]を呼び出さなくても機能しますが、スーパーは保持され、適切に解放されますか?はい、ARCを使用しています。ブロック内でsuperを呼び出すと、問題が発生しますか?代わりに__weakをsuperにするためのハックはありますか?
または、[self getMethod](継承されます)への直接呼び出しを禁止し、内部でのみ使用するにはどうすればよいですか?Objective-Cがこれを正確に実装していないことは知っていますが、実装ファイルでのみメソッドを宣言して実装するなどのトリックがあることは知っています。
編集#1:
SEL&IMPと関数ポインタを試してみました。問題は、IMPおよび関数ポインターがパラメーターとしてインスタンスを必要とし、これによりホールポイントがミュートになることです。
これは単に継承されたメソッドを呼び出します。スーパーで使用しようとすると、エラーが発生します。この時点で、先に進み、ブロック内でsuperを使用し、プロファイルを作成して、保持サイクルにつながるかどうかを確認します。
編集#2:
newacctの回答に基づいて、これが私がやったことです。
実際にはまだプロファイルを作成していませんが、これによって保持サイクルが回避されることを期待しています。
c# - 「メソッドの隠蔽」を使用するのが理にかなっているシナリオは何ですか?
重複の可能性:
有効な例を使用して c# に隠蔽されているメソッド。フレームワークに実装されているのはなぜですか? 実世界の利点は何ですか。
メソッドの非表示が c# でどのように役立つのか疑問に思っています。概念に飛び込むと、メソッドの隠蔽が混乱を招き、スパゲッティ コード スタイルに駆り立てられることがわかります。これにはいくつかの理由があり ます。
1- 派生クラスで新しいメソッドが必要な場合は、派生クラスで新しい名前の新しいメソッドを定義できます。
2-アップキャストを使用する場合、ポリモーフィックな方法で使用すると、期待される動作が実現されず、混乱を招く可能性があります。
(特に、基本クラスと派生クラスが異なるライブラリにあり、コードのどこかでそれらをポリモーフィックに使用したい場合、この奇妙な動作は非常に明白で明白になる可能性があります)
このような動作は混乱を招く可能性がありますが、「 Base 」で「 virtual」を使用し、「Derived 」で「override 」を使用した場合(ポリモーフィックな使用法を意味します)、出力は「I am Derived Class」でした。この出力は、私たちのほとんどが期待したものだと思います。
言い換えれば、階層では、ほとんどの開発者は、基本クラスの実装を隠したい派生クラス Not New メソッドのオーバーライドされたメソッドを期待していると思います。
C# 言語にメリットのない悪いことがなぜあるのか理解できませんか? 少なくとも、C# でメソッドを非表示にする最良の使用法を知りたいですか?
ご協力ありがとうございました
c++ - 派生クラスが非仮想関数をベースから隠すのを防ぐ
私が次のようなクラスAとBを持っていると考えてください
クラスAの設計者として、派生クラスBおよびAから派生する他のクラスが非仮想関数Fun()を非表示にするのを防ぐ(何らかのエラーが発生する)ように強制できる方法はありますか?
c# - ベースクラスに存在するメソッドを隠す
上記のコードは、メソッド ReturnContents() をオーバーライドしていません。隠れています。だから発言を期待してた
this.ReturnContents(safeContents, 所有者);
Locksmith クラス (OpenSafe() メソッド内) に存在し、オブジェクト 'JewelThief' から参照される場合、ReturnContents() メソッドが呼び出され、Jewelthief オブジェクトが存在します。
しかし、ベースクラス メソッドを呼び出すたびに、ReturnContents. この動作はどのように説明されますか?
java - メソッドオーバーライドエラーが発生するのはなぜですか?
これは私のスーパークラスです:
これは私のサブクラスです::
メインクラス:
問題は、Javac が静的メソッドでオーバーライド エラーを表示している理由を理解できないことです.PS plzz は、オーバーライドのすべてのルールが非表示にも有効であることを詳しく説明しています。お気に入り
新しいメソッド定義には、同じメソッド シグネチャ (つまり、メソッド名とパラメーター) と同じ戻り値の型が必要です。オーバーライド メソッドのパラメーターを final にするかどうかは、サブクラス メソッドのシグネチャの裁量に委ねられており、パラメーターの final 修飾子は含まれず、型と順序のみが含まれます。
新しい
メソッド定義はメソッドのアクセシビリティを狭めることはできませんが、広げることはできます。新しいメソッド定義は、スーパークラスのオーバーライドされたメソッドの throws 句で指定された例外クラスのすべてまたはまったく指定しないか、または例外クラスのサブセット (サブクラスを含む) のみを指定できます。
私のエラーは次のとおりです: 実行:
スレッド「メイン」での例外 java.lang.RuntimeException: コンパイルできないソース コード - javaapplication3.Subclass の m(int) は javaapplication3.Superclass の m(int) をオーバーライドできません:18) javaapplication3.min.main(JavaApplication3.java:25) で Java 結果: 1
また、メソッドがスーパークラスを拡張するサブクラスによって隠されているときにメソッドのどのバージョンが実行されるかを解決するためにクラス名から呼び出された静的メンバーかどうかを尋ねたいと思います。 . メインクラスの上記のコードで、次のように入力します: new Subclass().n();
コンパイラは、参照変数の型を提供していない場合でも、メソッドのサブクラス バージョンを呼び出す必要があることをどのように認識しますか?
c# - メソッドの隠蔽を使用しないのに、親メソッドを呼び出さないのはなぜですか?
次のコードを検討してください。
上記のコードでは、メソッドの隠蔽を使用していません。
学生のインスタンスを作成してshowinfo
メソッドを呼び出すと、出力はキーワードI am Student
を使用しません。new
メソッドの隠蔽を使用しないのに、親メソッドを呼び出さないのはなぜですか?