可能ですか? 何かのアクセスを変更できますかから何か else?C#publicメンバーを無効にしてプライベートにする
答えて
いいえ、あなたはサブクラスでプライベートメソッドを持つパブリックメンバを隠すことができますが、できないオーバーライドサブクラス内のプライベート1とパブリックメンバー。そして、実際には、それは単なる公的/私的なものではなく、一般的にアクセスを絞り込むために適用されます。
はを改訂:より制限のアクセスを非表示にすることにより - この場合には、民間のアクセスを - あなたはまだ基底クラスまたはサブクラスの参照から基底クラスのメンバーが表示されますが、それは新しいに延期う新しいアクセスレベルから利用可能な場合は、
一般に、非表示にすると、そのアクセスレベルで表示されるときに非表示が優先されます。それ以外の場合は元の方法が使用されます。
public class BaseClass
{
public virtual void A() { }
public virtual void B() { }
}
public class SubClass
{
// COMPILER ERROR, can't override to be more restrictive access
private override void A() { }
// LEGAL, you can HIDE the base class method, but which is chosen
// depends on level accessed from
private new void B() { }
}
したがってSubClass.B()
アクセス可能な場合は、基本クラスのメソッドのみを非表示にします。つまり、をと呼ぶと、それはB()
の隠れた形になりますが、B()
はプライベートなので、それ自身の外のクラスでは見えないので、まだBaseClass.B()
と表示されます。
長いとそれの短いです:
1)あなたは)より制限(アクセスが賢明であることをメソッドをオーバーライドすることはできません。 2)より限定的なメソッドを非表示にすることはできますが、新しいアクセスタイプが表示されている場合にのみ効果があります。そうでない場合は、ベースタイプが有効になります。
public class BaseClass
{
public virtual void A() { }
public virtual void B() { }
}
public class SubClass : BaseClass
{
public virtual void A() { B(); }
// legal, you can do this and B() is now hidden internally in SubClass,
// but to outside world BaseClass's B() is still the one used.
private new void B() { }
}
// ...
SubClass sc = new SubClass();
BaseClass bc = new BaseClass();
// both of these call BaseClass.B() because we are outside of class and can't
// see the hide SubClass.B().
sc.B();
bc.B();
// this calls SubClass.A(), which WILL call SubClass.B() because the hide
// SubClass.B() is visible within SubClass, and thus the hide hides BaseClass.B()
// for any calls inside of SubClass.
sc.A();
それは本当ですか?それはLiskovのを破るように見える –
あなたはそれを行うことができます。しかし、それを 'BaseClass'にキャストし、何も起こらなかったかのようにメソッドを呼び出すことができます。 – Femaref
@ブライアン:うん、もっと拘束するために隠れることは許されている。コンパイルは正常です。このメソッドはまだ存在し、それを基本クラス参照として扱う限り、それはまだそこにあり、実行され、サブクラス(プライベートな隠れの場合)からは見えません。それは常に最高の選択だと言っているわけではありませんが、C#では可能です。 –
いいえ。
これに対処する典型的な方法は、NotImplementedException
またはそのようなものを投げることです。
'NotImplementedException'は誤って何かを省略したことを意味します。 'NotSupportedException'は、設計によって何かが省略されたことを意味します(場合によっては* still *を間違えて)。 –
オーバーライドされたメンバの可視性を絞り込むことはできません。ただし、new
キーワードを使用して別のメソッドを定義することもできます。これは同じメソッドを使用することができますが、多態性の点では互換性がありません。
public class A : B
{
public new void Foo()
{
base.Foo();
}
}
これはover ** ride **ではなく、over ** write **です。このクラスを 'B'にキャストすると、メソッドを' A'で上書きしても利用可能になります。 – Femaref
@Femaref技術的には正しい権利です。 –
- 1. メンバーがプライベートで、C++
- 2. publicにC++クラスのプライベート変数を変換する
- 3. CA1047「メンバーをプライベート、パブリック、または内部のメンバーにする」とC++/CLIのイベント
- 4. Unity5プライベートvs Public GameObject
- 5. SSHでプライベートGitサーバを無効にする
- 6. IIS web.configを無効にしてリクエストフィルタリングを無効にする
- 7. ネイティブスクロールビューを無効にしてリフレッシュを無効にする
- 8. ボタンを無効にして無効にする
- 9. C#でWindows 10のホットキーを無効/無効にする方法
- 10. objective-cを使用してプレビューアイコンを無効にする方法
- 11. プライベートDocker v2レジストリにプッシュすると、エラーが発生します。マニフェストが無効
- 12. クリックして無効にして、setIntervalを有効にする
- 13. Windows Updateトレイアイコン(C#)を無効にする
- 14. C#デリゲート参照を無効にする
- 15. C#UWPポインタホイールを無効にする
- 16. asp.netのRequiredFieldValidatorを無効にするC#
- 17. C#フォームを無効にする
- 18. C#問題を無効にする
- 19. C#キーを無効にする方法
- 20. C#警告を無効にする
- 21. AndroidStudioでC++デバッガを無効にする
- 22. を無効にCアサーション
- 23. C++ freeRTOSタスク、非静的メンバー関数の無効な使用
- 24. 非静的メンバー関数の無効な使用C++
- 25. mutableメンバーは、mutableメンバーでないconst最適化を無効にしていますか?
- 26. C#からのpublic refクラスのC++/CLI静的メンバーの呼び出し#
- 27. プライベート文字列またはpublic static String?
- 28. CloudKit publicコンテナアクセスユーザーがログインしているのにiCloudドライブが無効になっている場合
- 29. C#を使用して無効なワイヤレスネットワークカードを有効にする方法
- 30. C#を使用してファイアウォールを有効または無効にする
私は、この正確なタイプミスを少なくとも1日1回書いています。 –
@ Phil:いいえ、OPはそれが正しいIMOを綴っていました。 ;) – Yuck
私は決まった後に気づかなかった –