2013年12月29日 星期日

[C#] 1-1 keyword abstract 使用抽象類別存取衍生類別的物件

(MSDN)抽象類別有下列功能:
  • 抽象類別不能執行實體化。
  • 抽象類別可能會包含抽象方法和存取子。
  • 無法使用 sealed (C# 參考) 修飾詞來修改抽象類別,因為這兩個修飾詞意義剛好相反。 sealed 修飾詞可以不讓類別被繼承,而 abstract 修飾詞卻需要類別被繼承。
  • 衍生自抽象類別的非抽象類別必須包含所有繼承抽象方法和存取子的實作。

在方法或屬性宣告裡使用 abstract 修飾詞,表示該此方法或屬性沒有包含實作。

範例 :
上半部是衍生類別
下半部是利用基礎的抽象類別去存取衍生類別物件


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace _1._1._1_abstract
  7. {
  8.     //有使用到抽象方法,請產生抽象類別
  9.     public abstract class baseclass
  10.     {
  11.         //名稱與編號
  12.         private string id = "";
  13.         private string name = "";
  14.         public string ID
  15.         {
  16.             get { return id; }
  17.             set { id = value; }
  18.         }
  19.         public string Name
  20.         {
  21.             get { return name; }
  22.             set { name = value; }
  23.         }
  24.         //輸出方法
  25.         //一般輸出
  26.         public void Show()
  27.         {
  28.             Console.WriteLine("基礎類別的show...");
  29.         }
  30.         //虛擬修飾字的輸出
  31.         public virtual void ShowV()
  32.         {
  33.             Console.WriteLine("基礎類別的virtual...show");
  34.         }
  35.         //抽象是不能宣告實體
  36.         public abstract void Showinfo();
  37.     }
  38.     //繼承抽象類別的衍生類別
  39.     public class derivedclass : baseclass
  40.     {
  41.         //使用"new"覆蓋基礎的Show
  42.         public new void Show()
  43.         {
  44.             Console.WriteLine("衍生類別的show...");
  45.             //base.Show();     //仍可利用base. 關鍵字來呼叫基礎類別的show()
  46.         }
  47.         //
  48.         public override void ShowV()
  49.         {
  50.             Console.WriteLine("衍生類別的virtual...show");
  51.         }
  52.        
  53.         //務必要實作抽象類別的方法,(使用override覆蓋檔案,前提是抽象類別方法要有virtual or abstract or override)
  54.         public override void Showinfo()
  55.         {
  56.             Console.WriteLine(ID + " " + Name);
  57.         }
  58.        
  59.     }
  60.     class Program
  61.     {
  62.         static void Main(string[] args)
  63.         {
  64.             //衍生實體物件,初始化
  65.             derivedclass one = new derivedclass();
  66.             one.ID = "001";
  67.             one.Name = "陳曉明";
  68.             //衍生輸出
  69.             one.Showinfo();
  70.             one.Show();
  71.             one.ShowV();
  72.             Console.WriteLine();
  73.             //基礎類別,使用衍生類別向上轉型指定給抽像類別 OK!!!
  74.             baseclass base1 = one;
  75.            
  76.             //抽象輸出
  77.             base1.Showinfo();
  78.             base1.Show();
  79.             base1.ShowV();        //注意!! 有virtual修飾的method,會根據物件的型態呼叫該物件的方法版本,不是依據ref基礎型態
  80.         }
  81.     }
  82. }

沒有留言:

張貼留言