2

私の質問はこのシナリオに属します

class A
{
    public virtual void show()
    {
         Console.WriteLine("Hey! This is from A;");
    }
}
class B:A
{
    public sealed override void show()
    {
         Console.WriteLine("Hey! This is from B;");
    }
}
class C:B
{
    public new void show()
    {          
         Console.WriteLine("Hey! This is from C;");         
    }          
}

また

class A
 {
      public  void show()
      {
           Console.WriteLine("Hey! This is from A;");
      }
 }
 class B:A
 {
      public new void show()
      {
               Console.WriteLine("Hey! This is from B;");
      }
 }

上記のコードでは、クラス C はクラス B のメソッド Show() を非表示にします

Q. SuperClass で既に定義されているSubclass OverrideHidesメソッドがないことをどのように確認できますか?

このようなもの、またはreadonlyフィールドに使用されるキーワードのようなものかもしれません

 class A1
 {
      public sealed void show() // I know it will give compilation error
      {
           Console.WriteLine("Hey! This is from A1");
      }
 }
 class B1 : A1
 {
      public void show()
      {
           Console.WriteLine("You must get a compilation Error if you create method with this name and parameter");
      }
 }

そんなキーワードある?

編集1:

はい、エクステンダーがメソッド名とパラメーターcozで正しい実装を使用していることを確認したいのですが、他の誰かがコードを調べた場合、それは正しいはずです

4

2 に答える 2

12

メソッドを隠すサブクラスが存在するのを防ぐ唯一の方法は、クラスを作成してsealedサブクラスを防ぐことです。サブクラスが存在する可能性がある場合、それらはメソッドをシャドウする可能性があり、それに対してできることは何もありません。

于 2013-09-20T18:55:14.180 に答える
0

メソッドに依存していてオーバーライドされていない場合ABsealed仕事をします。メソッドの隠蔽を防ぎたい場合は、 を必要とするすべてのメンバーまたは継承者がまたはAとして定義されていることを確認してください。AB

次の点を考慮してください。

A a = new A();
a.show(); // "Hey! This is from A;"

A a = new B();
a.show(); // "Hey! This is from B;"

B b = new B();
b.show(); // "Hey! This is from B;"

A a = new C();
a.show(); // "Hey! This is from B;"

B b = new C();
b.show(); // "Hey! This is from B;"

Casを参照する場合にのみCnewキーワードが効果を発揮します。

C c = new C();
c.show(); // "Hey! This is from C;"

要約すると、実装では、Aandの定義インスタンスのみをorBとして使用する必要があります。実際、アセンブリに のようなものが実装されていない限り、コードでのを強制的に呼び出すことはできません。ABCCpublic new void show()

于 2013-09-20T19:24:34.330 に答える