2.0 面向對象 類與實例(關鍵字)、封裝、繼承、多態(虛方法,抽象類,抽象方法,接口)

一切事物皆爲對象,對象是能夠看到、感受到、聽到、觸摸到、嚐到、或聞到的東西。 對象是一個自包含的實體,用一組可識別的特性和行爲來標識。面向對象編程(Object-Oriented Programming): 其實就是針對對象來進行編程。

面向對象的語言必須知足三大特性:封裝繼承多態

1、類與實例

  定義:具備相同屬性和功能的對象的抽象的集合,是對象的一種表現形式;實例化就是建立對象的過程(new),實例就是一個真實的對象。程序員

  修飾符和關鍵字:編程

分類名稱 修飾符/關鍵字 概述 實例使用
屬性修飾符 [Serializable] 按值將對象封送到遠程服務器。在按值封送對象時,就會建立一個該對象的副本,並將其序列化傳送到服務器。 任何對該對象的方法調用都是在服務器上進行的。  
  [STAThread] 是Single-Threaded Apartment單線程套間的意思,是一種線程模型(線程模式用於處理組件在多線程的環境裏並行與並互的方式),套間線程(STAThread)模式中接口跨線程傳遞必須被調度(Marshal),不調度直傳確定會失敗!而MTA或FreeThread模式中的接口能夠不經調度直接傳遞。這種調度在特定的環境中很是影響性能(可有幾百倍之差)。如VB裏只支持STAThread模式。FreeThread模式的組件會在裏面表現成和跨進程同樣慢!線程模式是微軟的COM基礎中的極其重要的概念。必定要吃透!  
  [MTAThread] 是MultiThreaded Apartment多線程套間的意思,同上也是一種線程模型。  
訪問修飾符 private 只有包含該成員的可使用,做用於類成員  
  protected 只有包含該成員的以及派生類能夠存取,做用於類成員  
  internal 只有當前工程(程序集)能夠存取,做用於程序集及之內  
  public 存取不受限制,任何地方均可以訪問,做用於程序集及之內  
類修飾符 abstract 抽象類。指示一個類只能做爲其它類的基類。  
  sealed 密封類。指示一個類不能被繼承。理所固然,密封類不能同時又是抽象類,由於抽象老是但願被繼承的。  
成員修飾符 abstract 指示該方法或屬性沒有實現。  
  sealed 密封方法。能夠防止在派生類中對該方法的override(重載)。不是類的每一個成員方法均可以做爲密封方法密封方法,必須對基類的虛方法進行重載,提供具體的實現方法。因此,在方法的聲明中,sealed修飾符老是和override修飾符同時使用。  
  delegate 委託。用來定義一個函數指針。C#中的事件驅動是基於delegate + event的。  
  event 聲明一個事件。  
  extern 指示方法在外部實現。  
  override 重寫。對由基類繼承成員的新實現。  
  readonly 指示一個域只能在聲明時以及相同類的內部被賦值。  
  static 指示一個成員屬於類型自己,而不是屬於特定的對象。即在定義後可不經實例化,就可以使用。  
  virtual 指示一個方法或存取器的實現能夠在繼承類中被覆蓋。  
  new 在派生類中隱藏指定的基類成員,從而實現重寫的功能。 若要隱藏繼承類的成員,請使用相同名稱在派生類中聲明該成員,並用 new 修飾符修飾它。  
  const 指定該成員的值只讀不容許修改。  
其餘關鍵字 this 關鍵字只能在方法內使用,包括構造方法,用來指代當前類自己的對象,關鍵字只能訪問實例成員  
  base base關鍵字的中文意思是超級的,使用base關鍵字能夠在子類中引用父類部分的內容。  
  typeof 獲取某一類型的 System.Type 對象,不能重載 typeof 運算符。eg:typeof(int)
View Code
using System;
namespace OperatorTest{
    public class OperatorTestClass{
        public static void Main(string[] args){
            Console.WriteLine(typeof(int));
            Console.WriteLine(typeof(Int32));
            Console.WriteLine(typeof(string));
            Console.WriteLine(typeof(double[]));
        }
    }
}

 

  as 經過引用轉換或裝箱轉換將對象轉換成引用指定類型,若失敗則返回NULL

 Object ob1 = "My";
 Object ob2 = 5; string a = ob1 as string; 成功a爲"My",失敗a爲NULL數組

   is 動態的檢查運行時對象類型是否和給定的類型兼容,它返回一個布爾值,表示可否經過引用轉換、裝箱轉換或拆箱轉換  if(1 is int){}

  類的聲明:[修飾符] class 類名{}服務器

  類的實例化:類名 實例名 = new 類名()   ---實例化時調用默認無參構造方法,若編寫了構造方法默認無參構造方法將失效多線程

  構造方法(構造函數):就是對類進行初始化,構造方法與類同名,無返回值(也不須要void), 在 new 時候調用. 聲明: [修飾符] 類名(參數列表){}ide

  方法重載:建立同名的多個方法,但參數類型或個數(參數列表)不一樣,提供了函數的擴充能力。函數

  字段和屬性: 屬性是一個方法或一對方法(get、set),適合於私有字段的方式使用方法調用的場合。性能

2、封裝

  定義:封裝是一種把代碼和代碼所操做的數據捆綁在一塊兒,使這二者不受外界干擾和誤用的機制;可理解爲一種用作保護的包裝器,以防止代碼和數據被包裝器外部所定義的其餘代碼任意訪問。this

  說明:1.良好的封裝可以減小耦合2.類內部的實現能夠自由地修改3.類具備清晰的對外接口.spa

  委託和事件: ---委託是對函數的封裝,能夠看成給方法的特徵指定一個名稱;事件是委託的一種特殊形式,當發生有意義的事情時,事件對象處理通知過程.(有篇博客深刻研究)

    封箱和拆箱:實際就是引用類型和object類型(引用類型)之間相互轉換;封箱實例:object obj = "str" //隱式封箱;拆箱實例: String s = (String)obj //顯示拆箱;

  屬性和索引器:

屬性 索引器
訪問修飾符 返回類型 屬性名{get{//取值代碼 return 屬性值}set{ //賦值代碼}}

 訪問修飾符 返回類型 this[索引列表]{ get{return 屬性值;} set{}}

定義:有效地封裝數據,方便地操做數據

 定義:是一種特殊的類成員,它可以讓對象以相似數組的方式來存取,使程序看起來更爲直觀,更容易編寫

容許調用方法,如同公共數據成員

容許調用對象上的方法,如同對象是一個數組

可經過簡單的名稱進行訪問 可經過索引器進行訪問
能夠爲靜態成員或實例成員 必須爲實例成員
其get訪問器沒有參數 其get訪問器具備與索引器相同的形參表
其set訪問器包含隱式value參數 除了value參數外,其set訪問器還具備與索引器相同的形參表

3、繼承   -------被繼承者:父類,超類,基類;繼承者:子類,派生類

  定義:繼承是指一個對象從另外一個對象中得到屬性的過程,繼承與封裝能夠互相做用,是一種 類與類之間強耦合的關係。

    優勢:1.使得全部子類公共的部分都放在了父類,使得代碼獲得了共享,避免了重複(子類擁有父類 非private的屬性和功能)。2.使得 修改或擴展 繼承而來的實現 都較爲容易(方法重寫等).

    缺點:1.父類變,則子類不得不變;2.會破壞包裝,父類實現細節暴露給了子類。增大了兩個類之間的耦合性。

    注意事項:1.子類構造方法的書寫:在子類的構造方法內部必須調用父類的構造方法,爲了方便程序員進行開發,若是在子類內部不書寫調用父類構造方法的代碼時,則子類構造方法將自動調用父類的默認構造方法。而若是父類不存在默認構造方法時,則必須在子類內部使用base關鍵字手動調用。子類構造方法的參數列表和父類構造方法的參數列表沒必要徹底相同;2.子類的構造過程:在構造子類時因爲須要父類的構造方法,因此實際構造子類的過程就顯得比較複雜了。

4、多態-----分爲靜態多態(方法重載)和動態多態(創建在繼承和方法重寫基礎上)

  定義:同一操做做用於不一樣的對象,能夠有不一樣的解釋,產生不一樣的執行結果。

  virtual(虛)方法: 被virtual修飾的是一個可被覆蓋的基類方法,在派生類中用override覆蓋該方法。(不能爲private方法)

 

View Code
public class Animal
{
    …
    public virtual void EatFood()
    {
        Console.WriteLine(「animal在吃食物」);
    }
    …
}
public class Cow : Animal
{
    …
    public override void EatFood()
    {
        Console.WriteLine(「Cow在吃食物」);
    }
    …
}
class Program{…
    static void Main(string[] args)
{…
       Animal animal1;
        animal1 = new Cow();
        animal1.EatFood();
…}
-----輸出: Cow在吃食物

  抽象類:是特殊的類(對象),只是不能被實例化,但能夠包括抽象方法,這是普通類所不能的。抽象類能夠派生自抽象類(只可繼承一個),能夠覆蓋基類的抽象方法也能夠不覆蓋,若是不覆蓋,則其派生類必須覆蓋它們,必須用abstract修飾,不能用密封(sealed)來修飾。

  抽象方法:是一個沒有方法體的方法(行爲),但不能實現只能聲明於抽象類中派生類必須覆蓋(實現)它們,必須用abstract修飾,自己是虛方法,不能在修飾。

View Code
    class MyClass1
    {
        public void Method1()
        {
            Console.WriteLine("wo shi yi ban de lei");
        }
    }
    abstract class MyAbs : MyClass1 
    {
        public abstract void AbMethod1();
    }
    class MyClass : MyAbs
    {
        public override void AbMethod1()
        {
            Console.WriteLine("wo shi bei ji cheng hou chong xie de lei");
        }
    }
    class MyClient
    {
        public static void Main()
        {
            MyClass mc = new MyClass();
            mc.Method1();
            mc.AbMethod1();
        }
    }

  接口:是單個或一組行爲(屬性、方法、事件、索引器),只是不能被實例化,不能加訪問修飾符,全部成員都是抽象(虛)的,能夠繼承多個接口

 

View Code
   
    interface IInterface1
    {
        void Method1();
    }
    interface IInterface:IInterface1
    {
    }
    abstract class MyAbs : IInterface
    {
        public void Method1()
        {
            Console.WriteLine("wo shi xian le bei jie kou ji cheng de jie kou");
        }
    }
    class MyClass : MyAbs
    {
    }
    class MyClient
    {
        public static void Main()
        {
        MyClass mc = new MyClass();
        mc.Method1();
        }
    }

 

      抽象類繼承接口時必須實現接口,可處理爲virtual方法和抽象方法

View Code
public abstract class AbsTest
{    
     public virtual void Test()    
    {        
        Debug.WriteLine("Test");   
    }    
     public abstract void NewTest();
}
public interface ITest
{    
     void Test();    
     void NewTest();
}
相關文章
相關標籤/搜索