0

派生クラスで基本クラスの保護関数を使用するには?

public class A
{
  protected void Test()
  {
      // some code....
  }
}

public class B : A
{
  public void Test2()
  {
    A obj = new A();
    obj.Test(); // error thrown;
  }
}

基本クラスの Test 関数を使用しようとしたとき。エラーをスローしています..

4

6 に答える 6

2

Test()基本型の新しいオブジェクトを作成しなくても、メソッドを直接呼び出すことができます。

public class A
{
  protected void Test()
  {
      // some code....
  }
}

public class B : A
{
  public void Test2()
  {
    Test();  // Calls the test method in the base implementation of the CURRENT B object
  }
}
于 2012-05-31T09:24:08.277 に答える
2

カプセル化を失うことなく、基本クラスの保護された静的メソッドを介してそれを行うことができると思います。

public class A
{
  protected void Test() { /* ... */ }

  protected static void Test(A obj)
  {
    obj.Test();
  }
}

public class B : A
{
  public void Test2()
  {
    A obj = new A();
    A.Test(obj);
  }
}

実質的A.Test()には、派生クラスとその兄弟からのみ呼び出すことができます。

テスト用のスニペット: http://volatileread.com/utilitylibrary/snippetcompiler?id=37293

于 2015-10-16T18:46:41.100 に答える
1

これは、'A'sTest()が保護されているためです。つまり、Bと見なされprivateます。

Bがから継承しA、保護されているものをA含むという事実は、他のオブジェクトがそのクラスから継承していても、 にTestアクセスできるという意味ではありません。Test

それでも:

からB継承しているためAプライベートメソッドBが含まれています。したがって、それ自体の関数にアクセスできますが、それはs関数にアクセスできるという意味ではありません。Test()BTestBATest

そう:

public class A
{
  protected void Test()
  {
      // some code....
  }
}

public class B : A
{
  public void Test2()
  {
    this.Test(); // Will work!
  }
}
于 2012-05-31T09:23:53.453 に答える
1

テストは、オブジェクト A のインスタンス内で保護されています。

電話するだけ

this.Test()

B 内にオブジェクト A を作成する必要はありません。

于 2012-05-31T09:23:54.217 に答える
1

「保護」という言葉を誤解しているようです。msdn をご覧ください: http://msdn.microsoft.com/en-us/library/bcd5672a(v=vs.71).aspx

あなたの例は次のようにする必要があります:

public class A
{
  protected void Test()
  {
      // some code....
  }
}

public class B : A
{
  public void Test2()
  {
    this.Test();
  }
}
于 2012-05-31T09:24:42.557 に答える
0

保護されたメソッドは、派生型でのみ使用できます。つまり、A のインスタンスを作成するときに、メソッドにパブリックにアクセスしようとしています。

于 2012-05-31T09:24:04.390 に答える