問題タブ [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# クラスの VB クラスからメソッドを非表示にする
画像処理と GUI 機能が厳密に分割されていないレガシー コードから、ImageEditor と呼ばれる大規模で複雑なクラスの一連の単体テストを作成しています。クラスのメソッドの 1 つである BaseImageChanged は、画像がどのように表示されるかに完全に関係しているようで、不要な複雑さを避けるために単体テストで無効にする必要があります。テスト プロジェクトは C# で、元のコードは VB です。私の考えは、C# でクラスのデコレータを作成し、何もしない空のメソッドの背後にメソッドを隠すことでした。ただし、単体テストを実行しようとすると、VB コードは古い BaseImageChanged メソッドを、置換が存在しないかのように参照し続けます。これが私がやっていることです:
(VBクラス)
(C#クラス)
この種の相互運用性を達成する方法はありますか、それとも別の方法を見つける必要がありますか?
編集: コンパイラ エラーは、リフレクションの問題であることが判明しました。また、基本クラスが元の ImageEditor クラスではなく ImageEditor のアクセサーである限り、メソッドのオーバーライドは機能しませんでした (コンパイラ エラーは発生しませんが、基本メソッドの動作はオーバーライドされませんでした)。
java - setEnabled メソッドをオーバーライドする JButton の Java サブクラスの問題
JButton を拡張する ImageButton というカスタム ボタン クラスがあります。その中に、JButton の setEnabled メソッドではなく、呼び出したい setEnabled メソッドがあります。
私のコードは以下です。別のクラスで ImageButton の新しいインスタンスを作成しましたが、setEnabled メソッドを使用しようとすると、JButton の setEnabled メソッドに直接行きます。コードを実行する前であっても、IDE は ImageButton の setEnabled メソッドが使用されていないことを通知しています。メソッドを「SetOn」に変更すると、正常に動作します。では、スーパークラスと同じ名前を使用できないのはなぜですか? 同じ名前ならスーパークラスのメソッドを非表示にするはずだと思った?
c# - 基本クラスのプロパティを適切に非表示にする方法
私が派生した基本クラス(ブラックボックス。変更できません)があります。私の派生クラスでは、ユーザーがプロパティを使用できるようにするのではなく、代わりにパブリック関数を使用できるようになりました。理由の詳細については説明しませんが(関係ありません)、非表示にしようとしているプロパティは次のとおりです。
私はこれを試しましたが、うまくいきませんでした:
私もこれを試しましたが、コンパイラは両方のアクセサをプライベートにすることは許可されていないと言っています。
これを適切に行うにはどうすればよいですか?私はこれが完全なセキュリティソリューションであることに依存していないことに注意してください。明らかに、基本クラスにキャストすることで、このプロパティを呼び出すことができます。これは単に、コンパイル時エラーをユーザーに提供することを目的としています。これは、ユーザーがこのプロパティを使用できず、代わりに派生クラスで新しい関数を使用する必要があることを理解するのに役立ちます。
編集
このスレッドの回答のおかげで、私は次の解決策を思いつきました。
java - スーパークラスのメソッドを隠す
メソッドのオーバーライドと非表示のチュートリアルを読みました。そしてそれから、私は以下を集めました:
サブクラスがスーパークラスのクラスメソッドと同じシグネチャを持つクラスメソッドを定義する場合、サブクラスのメソッドはスーパークラスのメソッドを非表示にします。
そのため、私は次のことを行いました。
このデザインについて私が気に入らないのは、それappend
がまだサブクラスの目に見えるメソッドであるということです。を投げる代わりにUnsupportedOperationException
、私は体を空のままにしておくことができました。しかし、どちらも醜い感じがします。
そうは言っても、スーパークラスのメソッドを隠すためのより良いアプローチはありますか?
java - 静的メソッドを非表示にする正当な理由はありますか?
派生クラスが基本クラスのメソッドをオーバーライドして隠したい正当な理由はありますか?static
c# - 継承されたクラスでヘルパー メソッドを非表示/オーバーロードするときの基本クラス メソッドの動作
予期しない値が生成されたときFoo
の動作を単体テストできるように、「ラッパー」を作成しようとしていました。ASP.NET パイプライン イベントに依存しているため、 inの動作に直接影響を与えることはできません。Test()
GetName()
GetName()
Foo
私は望んでいた
new Bar().Test();
「バー」を返しますが、明らかに継承モデルを誤解しています。
必要なものを達成する方法はありますか?
oop - スーパークラスにダウンキャストすることでメソッドのオーバーライドを防ぐことができますか?
次の質問に対する答えがすべての主要な OOP 言語で同じかどうかを理解しようとしています。そうでない場合、それらの言語はどのように異なりますか。
メソッドと;A
を定義するクラスがあるとします。メソッドは メソッドを呼び出します。のサブクラスオーバーライド メソッド(つまり、適切な構文を使用して、が呼び出されるたびにクラス内の実装が使用されるようにします)。act
jump
act
jump
A
B
jump
jump
B
b
私はクラスのオブジェクトを持っていますB
。それが class であるかのように正確に動作するようにしますA
。jump
つまり、の実装を使用して を実行したいのですA
。さまざまな言語でのオプションは何ですか?
たとえば、何らかの形式のダウンキャストでこれを達成できますか? または、呼び出すメソッドを認識しているプロキシ オブジェクトを作成することでしょうか?
クラスの新しいオブジェクトを作成し、 と の間でA
内部状態の共有を慎重に設定することは避けたいと思います。これは、明らかに将来性がなく、複雑であるためです。また、コピーするデータが大量にある可能性があるため、の状態をクラスの新しいオブジェクトにコピーすることも避けたいと思います。a
b
b
A
アップデート
私は特に Python についてこの質問をしましたが、これは Pythonで達成することは不可能であり、技術的には可能だと思われます...ちょっと..
技術的な実現可能性は別として、設計の観点からこれを行うことに反対する強い議論があるようです。それについては別の質問で尋ねています。
c# - c#でクラス内の関数を非表示にする方法は?
C# でコンストラクターに渡されるパラメーターに基づいて、クラス内のいくつかのメソッドを非表示にする必要があります。どうすればいいですか?前もって感謝します!
詳細情報: 私はこの GUI 開発の一部であり、ハードウェアのレジスタにアクセスできる API がありました。現在、彼らは新しいハードウェアをリリースしているので、新しい API を持つ古いものと新しいものの両方をサポートする必要があります (ほとんどの場合、古いものの複製で、一部の古いものが削除され、いくつかの新しいレジスタが追加されています)。
さらに、この「API」というクラスは、さまざまな場所で使用したため、この 1 つのクラスだけにしておく必要があります。そのため、別の名前の新しい API を使用するという考えは除外されました。
最後に、レジストリ アクセス メソッドを条件付きで非表示にするだけで、新しいものを古いものに含めるというこのアイデアを思いつきました。
c# - What is the difference between method hiding and shadowing in C#?
What is the difference between method hiding and shadowing in C#? Are they same or different? Can we call them as polymorphism (compile time or run time)?
java - 関連のない戻り値の型を持つ継承メソッド
次のコードスニペットがあります
コンパイルしようとすると、エラーが発生しました。
これを回避する方法は?