程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#重點知識解答(五 代理:一)

c#重點知識解答(五 代理:一)

編輯:C#入門知識
     第五章:代理
  代理實現的是象c++等語言的指針功能,不同於函數指針,代理是一種面向對象、安全類型的。代理事派生於公共基類(system)的一種參考類型,方法被壓入一個代理中,對於實例方法被稱為實例的組成實體或關於實例的方法,而靜態方法,被稱為類的組成實體或類方法。代理的強大功能是它可以自動的匹配方法,而不管其類型。
  
  寫一個代理包括三個步驟:
  
  
  寫代理、實例化、調用。
  
  
  代理的聲明使用以下語法:
  delegate void SimpleDelegate();
  
  實例化一個代理
  class Test
  {
   static void F() {
   System.Console.WriteLine("hello world");
   }
   static void Main() {
   SimpleDelegate d = new SimpleDelegate(F);//將方法壓入
   d();//通過代理;
   F();//不通過代理;
   }
  }
  
  
  最後讓我們調用她
  
  void MultiCall(SimpleDelegate d, int count) {
   for (int i = 0; i < count; i++)
   d();
   }
  }
  
   我們可以看到對於方法的調用是通過代理來完成的,調用時並不需要知道被調用她的類型。代理在我看來好比是對象要一件事她不直接地調用這個方法,而是通過一個中間人去調用她。
  
   下面就代理的強大功能進行詳細介紹:首先然我們實現一個這樣的功能,考慮一下該如何用指向基類的對象調用子類的成員函數。在這裡程序員是不是點懷戀指針了,不過在c#中這樣的功能完全也可實現的,使用一個單獨的代理我們可以完成這項功能。以下代碼來自Timothy A. Vanover文章。
  
  
  namespace DelegatesCS
  {
  using System;
  
  public class Wisdom //包含代理的類
  {
  public delegate string GiveAdvice();
  public string OfferAdvice(GiveAdvice Words)
  {
  return Words();
  }
  }
  public class Parent //基類
  {
  public virtual string Advice()
  {
  return("Listen to reason");
  }
  ~Parent() {}
  }
  public class Dad: Parent //子類
  {
  public Dad() {}
  public override string Advice()
  {
  return("Listen to your Mom");
  }
  ~Dad() {}
  }
  public class Mom: Parent //子類
  {
  public Mom() {}
  public override string Advice()
  {
  return("Listen to your Dad");
  }
  ~Mom() {}
  }
  public class Daughter //不繼承與基類的類
  {
  public Daughter() {}
  public string Advice()
  {
  return("I know all there is to life");
  }
  ~Daughter() {}
  }
  
  
  public class Test
  {
  public static string CallAdvice(Parent p)//使用基類
  {
  Wisdom parents = new Wisdom();
  Wisdom.GiveAdvice TeenageGirls = new Wisdom.GiveAdvice(p.Advice);//將Advice方法委托給TeenageGirls委托對象
  return(parents.OfferAdvice(TeenageGirls));
  }
  
  
  public static void Main()
  {
  Dad d = new Dad();
  Mom m = new Mom();
  Daughter g = new Daughter();
  //以下兩個為衍於基類的類
  Con

[1] [2] 下一頁  

sole.WriteLine(CallAdvice(d));
  Console.WriteLine(CallAdvice(m));
  //以下為未衍於基類的類,如果調用將出錯。
  //Console.WriteLine(CallAdvice(g));
  }
  }
  }  

上一頁  [1] [2] 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved