abstract和virtual

一、abstractide

      ·抽象方法就是沒有實現的,必須是形如:
             public abstract void Init();函數


   ·擁有抽象方法的類必須修飾一個abstract關鍵字從而變成一個抽象類;可是反過來,抽象類裏面不必定要有抽象方法,好比我寫了一個非抽象類,可是這個類我不想讓人直接實例            化,而只讓人繼承,我就能夠把他變成一個抽象類,雖然他裏面並無抽象方法。形如:
     abstract class TestAbstractSuperui


   ·抽象類不能被實例化,只能被繼承。this

   ·抽象類的子類必須實現每一個抽象方法。spa

   ·抽象類裏面除了能夠有抽象方法之外,也能夠有普通的方法。code

   ·抽象類的構造函數能夠省略,編譯器會自動加上,可是不能是一個抽象方法,而只能是一個普通的構造函數。blog

      抽象類是不能被實例化的,但抽象類能夠有構造函數。抽象類的構造函數用來初始化抽象類的一些字段,而這一切都在抽象類的派生類實例化以前發生。不只如此,抽線類的構造函數還有一種巧妙應用:就是在其內部實現子類必須執行的代碼。如下就是在抽象類的構造函數中來初始化字段。繼承

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Employee employee = new Employee();
 6             Console.WriteLine(employee.ID);
 7             Console.ReadKey();
 8         }
 9     }
10 
11     public abstract class Base
12     {
13         private Guid _id;
14 
15         public Base()
16         {
17             this._id = Guid.NewGuid();
18         }
19 
20         public Guid ID
21         {
22             get { return this._id; }
23         }
24     }
25 
26     public class Employee : Base
27     {
28         
29     }

小結:簡單歸納一下,抽象類不能夠直接實例化,他能夠有n個(n>=0)抽象方法,這些抽象方法子類必須實現。get

virtual:編譯器

一、聲明瞭virtual的方法無需去改動類的聲明,他只在此方法上起到影響。
二、只有virtual的方法能夠被子類override。
三、子類能夠不ouverride父類的virtual方法,這種狀況下他就像普通的父類方法同樣。
小結:簡單歸納一下,virtual關鍵字就是告訴子類,此方法能夠被override,但非強制。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

using System.Diagnostics;

 

namespace TestAppAllHere

{

    abstract class TestAbstractSuper

    {

        public TestAbstractSuper() 

        {

            Debug.WriteLine("這是父類的構造方法");

        }

 

        public abstract void Init();

 

        public void Hello() 

        {

            Debug.WriteLine("這是父類的非抽象方法");

        }

    }

}

  

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

using System.Diagnostics;

 

namespace TestAppAllHere

{

    class TestAbstractSub:TestAbstractSuper

    {

        public TestAbstractSub() 

        {

            Debug.WriteLine("這是子類的構造方法");

        }

 //___________________沒有重寫這個虛擬方法也是能夠照常運行的,會調用父類的虛擬方法_________________________        
//___________________重寫了以後父類的虛擬方法不會運行,而是重寫,固然能夠用base.來調用父類的方法__________ public override void Init() { Debug.WriteLine("這是子類重寫的方法"); } } }

 調用

<span style="white-space:pre">	</span>    TestAbstractSub sub = new TestAbstractSub();

            sub.Init();

            sub.Hello();

 輸出:

這是父類的構造方法

這是子類的構造方法

這是子類重寫的方法

這是父類的非抽象方法
相關文章
相關標籤/搜索