asp.net 2.0教程 c#中的介面、抽象、委託

來源:互聯網
上載者:User

尊重作者,請保留 www.it55.com 連結字樣。

在學習c# 2.0的新特性以前,我們一起來看看c#傳統印象裡的介面、抽象、委託是怎麼一回事。
1、介面包含諸如方法和屬性定義等一系列的聲明。而這些介面必須有實現介面的類來實現。
定義介面:
[存取許可權] interface 介面名稱
{
    介面體;
}
對介面的存取許可權比較常用的有public或internal。
在介面體中定義了各種各樣的實作類別時必須提供的代碼項。介面可以定義方法、屬性、索引、事件,但不包括域。
舉例:所有車輛的操作都包括“Start”和"Stop",狀態只有運行和非運行,我們可以使用Start()和Stop()方法來模型化這些功能,用"started"來表示車輛的運行與否。如:
public interface IDrivable
{
  void Start();
  void Stop();
  bool started
  {
    get;
  }
}
介面只規範started的get屬性、車輛的兩種操作函數,傳回型別void
下面的類來實現這個介面:
public class Car : IDrivable
{
  private bool _started = false;
  public void Start()
  {
     _started = true;
  }
  public void Stop()
  {
     _started = false;
  }
  public bool started
  {
     get
     {
        _return started;
     }
  }
}

接下來,程式就可以通過執行個體化這個Car類來實現對車輛的操作了:
Car myCar = new Car();
myCar.Start();

2、抽象類別有下列特點:(此處原文出自互連網,經筆者部分修改,感謝原作者)
聲明一個抽象方法使用abstract關鍵字;
一個類中可以包含一個或多個抽象方法;
抽象類別中可以存在非抽象的方法;
抽象類別不能被直接被執行個體化;
實現抽象類別用“:”(冒號),實現抽象方法用override關鍵字;
抽象類別可以被抽象類別所繼承,結果仍是抽象類別;
抽象方法被實現後,不能更改修飾符,並且在使用之前必須被重載(override)。

例如:
    public abstract class Person
    {
        public abstract void SayHello();//抽象方法
        public void about()//非抽象方法
        {
            Console.WriteLine("Abstract Demo");
        }
    }

    public class Student : Person
    {
        public override void SayHello()//抽象方法的重載
        {
            Console.WriteLine("SayHello");
        }
    }
    class MainClass
    {
        public static void Main()
        {
            new Student().SayHello();//使用重載後的類和方法
        }
    }

3、委託(此處原文出自互連網,寫的比我透徹,所以直接引用,感謝原作者)
   委託和事件這兩個概念是完全配合的。委託僅僅是函數指標,那就是說,它能夠引用函數,通過傳遞地址的機制完成。
   委託是一個類,當你對它執行個體化時,要提供一個引用函數,將其作為它建構函式的參數。
   每一個委託都有自己的簽名,例如:Delegate int SomeDelegate(string s, bool b);是一個委託申明,在這裡,提及的簽名,
   就是說SomeDelegate 這個委託 有 string 和 bool 類型的形參,返回一個int 類型。
   上面提及的:當你對委託執行個體化時,要提供一個引用函數,將其作為它建構函式的參數。
   這裡要注意了:被引用的這個函數必須和委託有相同的簽名。
 
   看下面的函數:
   private int SomeFunction(string str, bool bln){...}

   你可以把這個函數傳給SomeDelegate的建構函式,因為他們有相似的簽名(in other words,他們都有相同的形參類型和個數,並且返回相同的資料類型)。

     SomeDelegate sd = new SomeDelegate(SomeFunction);

   sd 引用了 SomeFunction,也就是說,SomeFunction已被sd所登記註冊,如果你調用 sd,SomeFunction 這個函數也會被調用,
   記住:我所說 SomeFunction的含義,後面,我們會用到它。

   委託類似於函數指標,它既能引用靜態(static)方法,也能引用執行個體方法。
   委託使用分三步:1、委託聲明。2、委託執行個體化。3、委託調用。

例:

using System;

namespace 委託
{
   delegate int NumOpe(int a,int b); //委託聲明
   class Class1
   {
     static void Main(string[] args)
     {
       Class1 c1 = new Class1();#p#分網頁標題#e#
       NumOpe p1 = new NumOpe(c1.Add); //委託執行個體化
       Console.WriteLine(p1(1,2)); //委託調用
       Console.ReadLine();
     }

     private int Add(int num1,int num2)
     {
       return(num1+num2);
     }
   }
}

例中,委託NumOpe引用了方法Add。
委託聲明了以後,就可以象類一樣進行執行個體化,執行個體化時把要引用的方法(如:Add)做為參數,這樣委託和方法就關聯了起來,就可以用委託來引用方法了。
委託和所引用的方法必須保持一致:參數個數、類型、順序必須完全一致;傳回值必須一致。

下一節我們會在本節基礎上分析學習:c# 2.0新特性 泛型

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.