繼承和多型

K戰神發表於2013-12-28

繼承、封裝、多型是物件導向的三大特性。這裡主要理解一下繼承和多型。繼承可以理解為子類繼承父類。

其中有幾個詞在繼承和多型中經常用到:new、virtual、override、sealed、abstract

結合例子看一下這幾個詞的用法和說明:

1、new:我認為就是一個標記。目的就是為了避免衝突。父類中的方法和子類中的方法一模一樣,子類的方法前加:new,來避免衝突。

程式碼:

 public class Parent
    {
        public Parent()
        {
            Console.WriteLine("父類構造");           
        }
        public void GaGa()
        {
            Console.WriteLine("父類的【GaGa】叫方法");
        }
        public virtual void Walk()
        {
            Console.WriteLine("父類走的動作");
        }
    }
    public class Children : Parent
    {
        public Children()
        {
            Console.WriteLine("子類的構造");            
        }
         new public void GaGa()
        {
            Console.WriteLine("子類方法GaGa與父類未公開繼承的GaGa方法重疊,子類用new將父類方法隱藏。");
        }
        public override void Walk()
        {
            Console.WriteLine("子類走的動作");
        }
    }   
View Code

父類Parent中: 

public void GaGa()
{
      Console.WriteLine("父類的【GaGa】叫方法");
}


子類中同樣有這樣的方法:加入new方法

 new public void GaGa()
{
      Console.WriteLine("子類方法GaGa與父類未公開繼承的GaGa方法重疊,子類用new將父類方法隱藏。");
}

那我們呼叫時這樣寫:

 class Program
    {
        static void Main(string[] args)
        {
            Parent p = new Children();
            //父類GaGa()方法
            p.GaGa();           
            Console.WriteLine("---------------------------------------");       
          
        }
    }

因為有new的區分父類和子類的方法(完全相同的方法),所以呼叫的是父類的GaGa方法。

執行結果截圖:

分析執行結果:子類繼承父類,例項化子類時,先構造父類構造,再構造子類構造,之後我們呼叫了子類中與父類相同方法的GaGa(),但是我們用new在子類方法前加以區分。

二、virtual  虛方法,也是一個標記,標記這個類中的方法可以在子類中重寫覆蓋(override)或者隱藏(new)

1、override

 public class Parent
    {
        public Parent()
        {
            Console.WriteLine("父類構造");           
        }
        public void GaGa()
        {
            Console.WriteLine("父類的【GaGa】叫方法");
        }
        public virtual void Walk()
        {
            Console.WriteLine("父類走的動作");
        }       
    }
    public class Children : Parent
    {
        public Children()
        {
            Console.WriteLine("子類的構造");            
        }
         new public void GaGa()
        {
            Console.WriteLine("子類方法GaGa與父類未公開繼承的GaGa方法重疊,子類用new將父類方法隱藏。");
        }
        public override void Walk()
        {
            Console.WriteLine("子類走的動作,完全覆蓋父類公開可以繼承的此方法");
        }       
    }   

這裡除了注意父類和子類的walk()方法的寫法,還需注意:

  Parent p = new Children();
            //父類GaGa()方法
            p.GaGa();    ----------這個是子類用new方法加以區別父類的方法
            p.Walk();    ----------這個是子類用 override 重寫覆蓋父類方法

注意執行結果:

我們例項化的是子類,但是賦給了父類引用,而子類中正好Walk()方法覆蓋了父類方法。這樣呼叫的時候就是子類的Walk()

方法的實現。

(2)new

public class Parent
    {
        public Parent()
        {
            Console.WriteLine("父類構造");           
        }
        public void GaGa()
        {
            Console.WriteLine("父類的【GaGa】叫方法");
        }
        public virtual void Walk()
        {
            Console.WriteLine("父類走的動作");
        }       
    }
    public class Children : Parent
    {
        public Children()
        {
            Console.WriteLine("子類的構造");            
        }
         new public void GaGa()
        {
            Console.WriteLine("子類方法GaGa與父類未公開繼承的GaGa方法重疊,子類用new將父類方法隱藏。");
        }
        new public  void Walk()-------------------------看這!!!!!!!!!
        {
            Console.WriteLine("子類走的動作,完全覆蓋父類公開可以繼承的此方法");
        }
       
    }   

區別於上面,父類Walk()標記為virtual 可以重寫,現在的子類是用new也是區別於相同方法

呼叫結果:

對的,子類沒有用override覆蓋父類方法,所以呼叫的還是父類的那個自己的Walk()方法。

 

三、override:上面已經提到是在父類中用到virtual,子類就用override進行重寫。

 

四、sealed密封的,密封類是不可以繼承的。

 

五、abstract:抽象,抽象類中的抽象方法,繼承了此類的子類必須重寫抽象實現

 

總結:

關鍵字 可以擁有此關鍵字的物件 作用    
new 子類與父類擁有相同方法的子類方法 隱藏父類相同方法,這樣子類和父類的方法相互獨立,不會存在衝突    
virtual 父類的方法 父類的此方法可以讓父類進行重寫,子類可以根據實際情況決定是否重寫。    
override 子類對應重寫父類的方法,用此標記。 用於子類對父類標記virtual的方法的重寫標記,這樣就實實在在的覆蓋了父類的那個可以允許子類重寫的方法。記住是覆蓋。    
abstract 用於類和方法 類--不可以例項化,方法--如果繼承此類,就必須實現abstract方法。    
sealed 表示,該類不可以繼承    

 

 

相關文章