2011-08-24 6 views

答えて

14

いいえ、あなたはサブクラスでプライベートメソッドを持つパブリックメンバを隠すことができますが、できないオーバーライドサブクラス内のプライベート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(); 
+0

それは本当ですか?それはLiskovのを破るように見える –

+0

あなたはそれを行うことができます。しかし、それを 'BaseClass'にキャストし、何も起こらなかったかのようにメソッドを呼び出すことができます。 – Femaref

+0

@ブライアン:うん、もっと拘束するために隠れることは許されている。コンパイルは正常です。このメソッドはまだ存在し、それを基本クラス参照として扱う限り、それはまだそこにあり、実行され、サブクラス(プライベートな隠れの場合)からは見えません。それは常に最高の選択だと言っているわけではありませんが、C#では可能です。 –

3

いいえ。

これに対処する典型的な方法は、NotImplementedExceptionまたはそのようなものを投げることです。

+6

'NotImplementedException'は誤って何かを省略したことを意味します。 'NotSupportedException'は、設計によって何かが省略されたことを意味します(場合によっては* still *を間違えて)。 –

2

オーバーライドされたメンバの可視性を絞り込むことはできません。ただし、newキーワードを使用して別のメソッドを定義することもできます。これは同じメソッドを使用することができますが、多態性の点では互換性がありません。

public class A : B 
{ 
    public new void Foo() 
    { 
     base.Foo(); 
    } 
} 
+2

これはover ** ride **ではなく、over ** write **です。このクラスを 'B'にキャストすると、メソッドを' A'で上書きしても利用可能になります。 – Femaref

+0

@Femaref技術的には正しい権利です。 –

関連する問題