程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#中的abstract與virtual

C#中的abstract與virtual

編輯:關於C#

abstract

abstract 修飾符可以和類、方法、屬性、索引器及事件一起使用。

在類聲明中使用 abstract 修飾符以指示類只能是其他類的基類。

抽象類具有以下特性:

·抽象類不能實例化。

·抽象類可以包含抽象方法和抽象訪問器。

·不能用 sealed 修飾符修改抽象類,這意味著該類不能被繼承。

·從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實實現。

·在方法或屬性聲明中使用 abstract 修飾符以指示此方法或屬性不包含實現。

抽象方法具有以下特性:

·抽象方法是隱式的 virtual 方法。

·只允許在抽象類中使用抽象方法聲明。

·因為抽象方法聲明不提供實實現,所以沒有方法體;方法聲明只是以一個分號結束,並且在簽名後沒有大括號 ({ })。例如: public abstract void MyMethod();

·實現由 overriding 方法提供,它是非抽象類的成員。

·在抽象方法聲明中使用 static 或 virtual 修飾符是錯誤的。

除了在聲明和調用語法上不同外,抽象屬性的行為與抽象方法一樣。

·在靜態屬性上使用 abstract 修飾符是錯誤的。

·在派生類中,通過包括使用 override 修飾符的屬性聲明可以重寫抽象的繼承屬性。

virtual

virtual 關鍵字用於修改方法或屬性的聲明,在這種情況下,方法或屬性被稱作虛擬成員。虛擬成員的實現可由派生類中的重寫成員更改。

調用虛方法時,將為重寫成員檢查該對象的運行時類型。將調用大部分派生類中的該重寫成員,如果沒有派生類重寫該成員,則它可能是原始成員。

默認情況下,方法是非虛擬的。不能重寫非虛方法。

不能將 virtual 修飾符與以下修飾符一起使用:

static  abstract  override

除了聲明和調用語法不同外,虛擬屬性的行為與抽象方法一樣。

·在靜態屬性上使用 virtual 修飾符是錯誤的。

·通過包括使用 override 修飾符的屬性聲明,可在派生類中重寫虛擬繼承屬性。

override(覆蓋上面兩種關鍵字修飾方法)

使用 override 修飾符來修改方法、屬性、索引器或事件。重寫方法提供從基類繼承的成員的新實現。由重寫聲明重寫的方法稱為重寫基方法。重寫基方法必須與重寫方法具有相同的簽名。

不能重寫非虛方法或靜態方法。重寫基方法必須是虛擬的、抽象的或重寫的。

重寫聲明不能更改虛方法的可訪問性。重寫方法和虛方法必須具有相同的訪問級修飾符。

不能使用下列修飾符修改重寫方法:

new  static  virtual  abstract

重寫屬性聲明必須指定與繼承屬性完全相同的訪問修飾符、類型和名稱,並且重寫屬性必須是虛擬的、抽象的或重寫的。

using System;

namespace VitualMethod
{
   class BeiseClass
   {
     public void RealMethod()
     {
       Console.WriteLine(@"The ""RealMethod"" method of ""BeiseClass"" class!");
     }

    public virtual void ViutualMethod()
     {
       Console.WriteLine(@"The ""ViutualMethod"" method of ""BeiseClass""class!");
     }
   }

class NewAndOverride: BeiseClass
   {
     /**//// <summary>
     /// “new”用於隱藏基類成員的繼承成員,是重寫方法的另一種辦法;
     /// 在同一成員上同時使用 new 和 override 是錯誤的;
     /// “override”只是隱藏了虛擬方法。
     /// </summary>
     new public void RealMethod()
     {
       Console.WriteLine(@"The ""RealMethod"" method of ""NewAndOverride"" class!");
     }

    public override void ViutualMethod()
     {
       Console.WriteLine(@"The ""ViutualMethod"" method of ""NewAndOverride""class!");
     }
   }

  class Tester
   {
     /**//// <summary>
     /// 運行結果:
     /// The "RealMethod" method of "BeiseClass" class!
     /// The "RealMethod" method of "NewAndOverride" class!
     /// The "ViutualMethod" method of "BeiseClass"class!
     /// The "ViutualMethod" method of "NewAndOverride"class!
     ///
     /// The "RealMethod" method of "BeiseClass" class!
     /// The "ViutualMethod" method of "NewAndOverride"class!
     /// </summary>
     static void Main()
     {
       BeiseClass beiseClass = new BeiseClass();
       NewAndOverride newAndOverride = new NewAndOverride();

       beiseClass.RealMethod();
       newAndOverride.RealMethod();

beiseClass.ViutualMethod();
       newAndOverride.ViutualMethod();

      Console.WriteLine();

      //
       // 注意:可以看到隱藏方法仍然存在,而被覆蓋的方法已經不存在了;
       //
       beiseClass = newAndOverride;

       beiseClass.RealMethod();
       beiseClass.ViutualMethod();

    }
   }
}

new 使用 new 修飾符顯式隱藏從基類繼承的成員。若要隱藏繼承的成員,請使用相同名稱在派生類中聲明該成員,並用 new 修飾符修飾它。

類成員聲明中可以使用與一個被繼承的成員相同的名稱或簽名來聲明一個成員。發生這種情況時,就稱該派生類成員隱藏了基類成員。隱藏一個繼承的成員不算是錯誤,但這確實會導致編譯器發出警告。若要取消此警告,派生類成員的聲明中可以包含一個 new 修飾符,表示派生成員是有意隱藏基成員的。

using System;

namespace TheNewKeyword
{

  class NewTestClassBase
   {
     public void PrintNewKeyword()
     {
       Console.WriteLine(@"This is base class!");
     }
   }

  class NewTestClass : NewTestClassBase
   {
     /**//// <summary>
     /// 如果這樣寫:
     /// override public void PrintNewKeyword()
     ///
     /// 將產生編譯錯誤:
     /// “TheNewKeyword.NewTestClass.PrintNewKeyword()” :
     /// 無法重寫繼承成員“TheNewKeyword.NewTestClassBase.PrintNewKeyword()”,
     /// 因為它未標記為 virtual、abstract 或 override。
     /// </summary>
     new public void PrintNewKeyword()
     {
       Console.WriteLine(@"This is ""new"" keyword!");
     }
   }

   /**//// <summary>
   /// TheNewKeyword 測試“new”關鍵字。
   /// </summary>
   class TheNewKeyword
   {
     /**//// <summary>
     /// 運行結果:
     /// This is base class!
     /// This is "new" keyword!
     /// </summary
     static void Main()
     {
       //
       // TODO: 在此處添加代碼以啟動應用程序
       //
       NewTestClassBase newTestClassBase = new NewTestClassBase();
       NewTestClass newTestClass = new NewTestClass();

      newTestClassBase.PrintNewKeyword();
       newTestClass.PrintNewKeyword();
     }
   }

原帖:http://hi.baidu.com/chyspace/blog/item/900ff9ca6d6b6647f31fe7fa.html

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