cxi依頼詳細


依頼はタイプです。C(※)の依頼は対象に向けられており、タイプが安全であるため、依頼例を作成すると、作成された例は呼び出しリストを含み、呼び出しリストには複数の方法が含まれてもよい。各方法は一つの呼び出しエンティティと呼ばれる。呼び出しエンティティは、静的な方法であってもよく、例示的な方法であってもよい。例示的な方法である場合、呼び出しエンティティは、この方法の実例を呼び出す例を含む。依頼は、呼び出し方法が属するクラスには関心がなく、呼び出し方法と依頼のタイプが互換性があるかどうかだけに関心があります。コードの例は以下の通りです。

using System;
namespace LycheeTest{
 public delegate void D(int a, int b);
 public class Test {
 public D myDelegate;
 public Test() {
  myDelegate = new D(Show1);
 }
 private static void Show1(int a, int b) {
  Console.WriteLine("   Show1    ,         :{0}", a + b);
 }
 private void Show2(int a, int b) {
  Console.WriteLine("   Show2    ,         :{0}", a + b);
 }
 private void Show3(int a, int b) {
  Console.WriteLine("   Show3    ,         :{0}", a + b);
 }
 }
 public class Program {
 static void Main(string[] args) {
  Test myT = new Test();
  myT.myDelegate(33, 22);
  Console.ReadKey();
 }
 }
}
このコードのデモンストレーションは最も簡単な委託形式である。依頼の種類は、クラスの外部に定義することもでき、クラスの内部に定義することもできます。このセグメントコードはクラスの外部に定義されています。3行目のコードで定義されているのは依頼の種類で、依頼の種類のキーワードはdelegateであり、キーワードの前には依頼の種類のアクセス権限修飾子である。キーワードの後は依頼タイプの戻りタイプですが、この戻りタイプの規定は依頼タイプと互換性のある方法の戻りタイプと同じでなければなりません。戻るタイプの後は依頼の種類の名前です。次に、参照リストです。委託の種類に対応する方法を指定するパラメータの種類と個数は同じでなければなりません。5行目のコードは依頼型の変数を定義しています。これはインスタンスフィールドで、アクセス権限はpublicです。注意依頼の種類フィールドのアクセス権限は、依頼の種類のアクセス権限より低いか、依頼の種類のアクセス権限と同じでなければなりません。9行目、12行目、15行目のコードは、3つの方法を定義しています。9行目のコードは静的な方法です。このコードの実証は最も簡単な委託使用法であるため,その中の静的方法のみを用いた。6行目の構成方法では、委託型の変数を実例化しています。委託変数の呼び出しリストの追加方法は、その構成方法に方法名を伝えるだけでいいです。これは呼び出し方法の追加を依頼するための最も基本的な方法です。21行目はTestクラスの一例を定義し、22行目はクラスの委託メンバーを呼び出した。委託メンバーを呼び出した場合は、そのイメージリストに参加者を転送する必要があります。これが一番基本的な依頼の使い方です。このコードの実行結果は以下の通りです。 Show1 , :55以下に依頼の種類の使い方を紹介します。実例コードは以下の通りです。

using System;
namespace LycheeTest {
 public delegate void D(int a, int b);
 public class Test {
 public static void Show1(int a, int b) {
  Console.WriteLine("   Show1    ,         :{0}", a + b);
 }
 public void Show2(int a, int b) {
  Console.WriteLine("   Show2    ,         :{0}", a + b);
 }
 public void Show3(int a, int b) {
  Console.WriteLine("   Show3    ,         :{0}", a + b);
 }
 }
 public class Program {
 static void Main(string[] args) {
  Test myT = new Test();
  D myDelegate = new D(Test.Show1);
  D myDelegate1 = new D(myT.Show2);
  D myDelegate2 = new D(myT.Show3);
  myDelegate(22, 33);
  myDelegate1(33, 44);
  myDelegate2(55, 66);
  Console.ReadKey();
 }
 }
}
このコードはクラス中の委託タイプフィールドをキャンセルして、委託タイプを一つの種類として扱う。入口ポイント法を含むクラスでは、まず17行目にTestクラスの変数を定義し、実用化しました。クラスの実例的な方法を委託するためには、クラスのインスタンスが存在してこそ、クラスの実例的な方法を引用することができる。18行目は依頼型の変数を定義していますが、ここではクラスの一員ではないので、その構造方法に静的方法を伝える場合は、クラス名で参照する必要があります。19行目にも依頼型の変数が定義されていますが、例の方法を伝える際には、クラスのインスタンスで参照する必要があります。20行目のコードの場合は19行目のコードと同じです。方法を依頼する場合は、メソッドのイメージリストを必要とせずに方法名を伝える必要があります。21行目から23行目までは、依頼に対する呼び出しです。このコードの実行結果は以下の通りです。

   Show1    ,         :55 
   Show2    ,         :77 
   Show3    ,         :121
依頼のアクセス識別子
クラスの外部に委託する場合、使用できるアクセス修飾子は、publicとinternalを含む。何も書かないなら、デフォルトはインターナショナルです。クラスの内部に委託する場合、使用できるアクセス修飾子はpublic、protected、internal、protectedを含む。

using System;
namespace LycheeTest{
 public class Test {
 protected delegate void D(int a, int b);
 private delegate void D1(int a, int b);
 protected internal delegate void D2(int a, int b);
 internal delegate void D3(int a, int b);
 private D myD;
 private D1 myD1;
 private D2 myD2;
 private D3 myD3;
 public Test() {
  myD = new D(Show1);
  myD1 = new D1(Show1);
  myD2 = new D2(Show1);
  myD3 = new D3(Show1);
 }
 public static void Show1(int a, int b) {
  Console.WriteLine("   Show1    ,         :{0}", a + b);
 }
 public void Show2(int a, int b) {
  Console.WriteLine("   Show2    ,         :{0}", a + b);
 }
 public void Show3(int a, int b) {
  Console.WriteLine("   Show3    ,         :{0}", a + b);
 }
 public void Use() {
  myD(11, 12);
  myD1(22, 45);
  myD2(55, 78);
  myD3(345, 100);
 }
 }
 class Test1: Test {
 private D Test1D;
 private D2 Test1D2;
 private D3 Test1D3;
 public Test1() {
  Test1D = new D(Test.Show1);
  Test1D2 = new D2(Test.Show1);
  Test1D3 = new D3(Test.Show1);
 }
 public void Use1() {
  Test1D(22, 45);
  Test1D2(44, 45);
  Test1D3(77, 78);
 }
 }
 public class Program {
 static void Main(string[] args) {
  Test1 myT1 = new Test1();
  myT1.Use();
  myT1.Use1();
  Console.ReadKey();
 }
 }
}
コードの4行目はクラスの内部に依頼の種類を定義しています。クラスのメンバーとして定義されています。アクセス権限はプロテックスです。このクラスの内部にアクセスできます。派生クラスにアクセスすることもできます。コードの5行目に定義されている依頼の種類は、アクセス権限がprvateであり、このクラスの内部のみにアクセスできます。コードの6行目に定義されているプロテクターinternalアクセス権限の依頼の種類は、本プログラムのセットにアクセスすることができ、派生クラスにアクセスすることもできます。7行目に定義されている依頼の種類はinternalで、このプログラムセットにしかアクセスできません。これらの依頼の種類はすべてこのクラスの内部にアクセスできるため、10行目から13行目までの変数が定義されています。12行目の例示的な構成方法では、これら4つの依頼型の変数を実装し、それらの呼び出しリストに方法Show 1を追加した。Show 1は静的な方法ですが、クラス内に依頼の種類の構造方法が入ってくる場合は、クラス名の引用は必要ありません。27行目には例示的な方法が定義され、これらの4つの依頼が方法内で呼び出され、それが実用化される。第34行コードはまた、ベースTestから継承されるクラスを定義している。ベースクラスの依頼の種類はD、D 2、D 3のみが派生クラスにアクセスできるので、35行目から37行目までの変数が定義されています。なお、それらは基質の委託変数と同じタイプですが、それらは異なる依頼です。38行目の例示的な構成方法では、これらの3つの依頼型の変数の一例を作成し、リスト参加方法を呼び出します。静的方法Show 1も派生クラスによって継承されているので、ここに入ってきた方法名は、クラス名参照を使用しても良いし、クラス名参照を使用しなくても良いです。43行目は、これらの3つの依頼を内部で呼び出し、それらのために実行に入る例示的な方法を定義している。51行目は、派生クラスの例を定義し、その後、例示的な方法UseおよびUse 1を呼び出す。このコードの実行結果は以下の通りです。

   Show1    ,         :23 
   Show1    ,         :67 
   Show1    ,         :133
   Show1    ,         :445 
   Show1    ,         :67 
   Show1    ,         :89 
   Show1    ,         :155
DとD 2のアクセス権限はprotectedとprotected internalに定義されているからです。したがって、他のプログラムセットでアクセスできるかどうかを検証します。まず、このセグメントのコードに含まれるMainメソッドを含むクラスを削除し、プロジェクトの属性においてクラスライブラリに変更します。次にコンソール項目を新規作成し、物理的にこのクラスを参照します。コンソールプロジェクトのコードは以下の通りです。

using System;
using LycheeTest;
namespace LycheeTest1{
 class Program: Test {
 private D pD;
 private D2 pD2;
 public Program() {
  pD = new D(Show1);
  pD2 = new D2(Show1);
 }
 public void Use3() {
  pD(34, 33);
  pD2(12, 11);
 }
 static void Main(string[] args) {
  Program p = new Program();
  p.Use3();
  Console.ReadKey();
 }
 }
}
第3行コードの名前空間とクラスライブラリの名前空間は2つの独立した名前空間であり、そのメンバーは同じ名前空間内にいないからです。したがって、名前空間内で他の名前空間のメンバーを引用する場合は、別の名前空間の名前を付けて参照する必要があります。コードの作成を容易にするために、2行目のコードはまずクラスの名前空間を引用しました。4行目のコードは、ベースTestから引き継ぐクラスを定義しています。派生タイプなので、依頼タイプDとD 2に対してもアクセスできます。5行目のコードと6行目のコードはそれぞれDとD 2の変数を定義します。7行目の例示的な構成方法は、これらの2つの変数を実装し、その着信方法Show 1を示している。Show 1メソッドは継承されているので、クラス名の引用は必要ありません。11行目のコードは、この2つの依頼を呼び出し、それを実行するための例示的な方法を定義しています。16行目のコードは、クラスの一例を定義し、例示的な方法Use 3を呼び出します。このコードの実行結果は以下の通りです。

   Show1    ,         :67
   Show1    ,         :23
クラスTestの中の委託タイプD 2とD 3は共にinternalの権限を持っています。現在は、同じプログラム集中の非派生類に対してそれらにアクセスできるかどうかを検証します。まず、クラスライブラリをコンソールプロジェクトに変更し、クラスを追加します。このクラスはTestクラスにとって独立しています。それらの間は一つのプログラムセットにしか位置していません。お互いの関係は引き継がれていません。コードは以下の通りです

using System;
namespace LycheeTest {
 public class Test {
 protected delegate void D(int a, int b);
 private delegate void D1(int a, int b);
 protected internal delegate void D2(int a, int b);
 internal delegate void D3(int a, int b);
 private D myD;
 private D1 myD1;
 private D2 myD2;
 private D3 myD3;
 public Test() {
  myD = new D(Show1);
  myD1 = new D1(Show1);
  myD2 = new D2(Show1);
  myD3 = new D3(Show1);
 }
 public static void Show1(int a, int b) {
  Console.WriteLine("   Show1    ,         :{0}", a + b);
 }
 public void Show2(int a, int b) {
  Console.WriteLine("   Show2    ,         :{0}", a + b);
 }
 public void Show3(int a, int b) {
  Console.WriteLine("   Show3    ,         :{0}", a + b);
 }
 public void Use() {
  myD(11, 12);
  myD1(22, 45);
  myD2(55, 78);
  myD3(345, 100);
 }
 }
 class Test1 {
 private Test.D2 tD2;
 private Test.D3 tD3;
 public Test1() {
  tD2 = new Test.D2(Test.Show1);
  tD3 = new Test.D3(Test.Show1);
 }
 public void Use3() {
  tD2(34, 33);
  tD3(22, 21);
 }
 }
 public class Program {
 static void Main(string[] args) {
  Test1 myT1 = new Test1();
  myT1.Use3();
  Console.ReadKey();
 }
 }
}
このコードの中で、元のクラスTestは修正されていません。35行目には、Testクラスに対して独立したクラスであるクラスが定義されている。これらの関係は同じプログラムセットに限定されます。36行目のコードと37行目のコードは、委託タイプD 2とD 3の2つの変数を定義します。この2つのクラスは継承関係ではないので、Testクラスの2つの依頼のタイプを引用するにはTestクラスのクラス名を使用して参照する必要があります。38行目のコードは例示的な構成方法であり、構造方法においては委託を実施する。依頼の種類を具体化するには、やはりクラス名を使って依頼の種類名を引用し、伝える方法名も同じです。第42行は、委託を呼び出して実際に参加する方法の例を定義している。49行目のコードは、クラスTest 1の例を定義し、61行目のクラスの例示的な方法を呼び出す。このコードの実行結果は以下の通りです。

   Show1    ,         :67
   Show1    ,         :43
以上が本文の全部です。本文の内容は皆さんの学習や仕事に一定の助けをもたらしてくれると同時に、私達を応援してください。