C# 繼承和接口程序員
繼承編程
繼承(以及封裝和多態性)是面向對象的編程的三個主要特徵之一。經過繼承,能夠建立重用、擴展和修改在其餘類中定義的行爲的新類。其成員被繼承的類稱爲 「基類」 ,繼承這些成員的類稱爲 「派生類」 。派生類只能有一個直接基類。可是,繼承是能夠傳遞的。若是 ClassC 派生自 ClassB ,而且 ClassB 派生自 ClassA ,則 ClassC會繼承在 ClassB 和 ClassA 中聲明的成員。ide
繼承的代碼實現:函數
1 /// <summary> 2 /// 構建一個工做項的業務類(缺省繼承自基類Object) 3 /// </summary> 4 public class WorkItem 5 { 6 private static int currentID; // 用於存儲最新加入的工做項的ID的靜態字段 7 8 protected int ID { get; set; } // 工做項標識符 9 protected string Title { get; set; } // 名稱 10 protected string Description { get; set; } // 說明 11 protected TimeSpan JobLength { get; set; } // 所需時長 12 13 public WorkItem() 14 { 15 ID = 0; 16 Title = "缺省的工做名稱"; 17 Description = "簡單的描述"; 18 JobLength = new TimeSpan(); 19 } 20 21 public WorkItem(string title,string desc,TimeSpan joblen) 22 { 23 this.ID = GetNextID(); 24 this.Title = title; 25 this.Description = desc; 26 this.JobLength = joblen; 27 } 28 29 /// <summary> 30 /// 靜態構造函數,用來初始化靜態屬性 31 /// </summary> 32 static WorkItem() 33 { 34 currentID = 0; 35 } 36 37 /// <summary> 38 /// 構建下一個對象的ID 39 /// </summary> 40 /// <returns></returns> 41 protected int GetNextID() 42 { 43 return ++currentID; 44 } 45 46 /// <summary> 47 /// 更新 48 /// </summary> 49 /// <param name="title"></param> 50 /// <param name="joblen"></param> 51 public void Update(string title,TimeSpan joblen) 52 { 53 this.Title = title; 54 this.JobLength = joblen; 55 } 56 57 public override string ToString() 58 { 59 return String.Format("{0}-{1}", this.ID, this.Title); 60 } 61 } 62 63 /// <summary> 64 /// 變動工做項請求 65 /// </summary> 66 public class ChangeRequest : WorkItem 67 { 68 protected int originalItemID { get; set; } // 原來安排工做項的ID 69 70 public ChangeRequest() 71 { 72 73 } 74 public ChangeRequest(string title,string desc,TimeSpan joblen,int originalID) 75 { 76 this.ID = GetNextID(); 77 this.Title = title; 78 this.Description = desc; 79 this.JobLength = joblen; 80 81 this.originalItemID = originalID; 82 } 83 }
繼承的實際應用ui
1 /// <summary> 2 /// 繼承的實際應用 3 /// </summary> 4 public static class Inheritence 5 { 6 public static void ToInheritence() 7 { 8 // 定義一個工做項 9 WorkItem item = new WorkItem("修復 Bugs", "修復當前代碼的所有 bug", new TimeSpan(3, 4, 0,0)); 10 11 // 定義一個工做項變動要求 12 ChangeRequest change = new ChangeRequest("變動基類設計內容", "添加類成員", new TimeSpan(4, 0, 0), 1); 13 14 Console.WriteLine(item.ToString()); 15 16 //Console.WriteLine(change.ToString()); 17 18 change.Update("進一步變動基類設計內容", new TimeSpan(4, 0, 0)); 19 20 Console.WriteLine(change.ToString()); 21 Console.ReadKey(); 22 } 23 }
抽象類(abstract)this
抽象類不能實例化,抽象類的用途是提供一個可供多個派生類共享的通用基類定義。例如,類庫能夠定義一個抽象類,將其用做多個類庫函數的參數,並要求使用該庫的程序員經過建立派生類類提供本身的類實現(說明:不完整且必須在派生類中實現的類和類成員)spa
相關代碼:設計
1 /// <summary> 2 /// 抽象類,不能實例化(一個沒有構造函數的類) 3 /// 用途是提供一個可供多個派生類共享的通用基類定義(如: 4 /// 類庫能夠定義一個抽象類,將其用做多個類庫函數的參數,並要求使用該類庫的程序員經過建立派生類來提供本身的類實現 5 /// </summary> 6 public abstract class StudentUpdateLog 7 { 8 public Guid ID { get; set; } 9 public DateTime UpdateTime { get; set; } // 更新時間 10 public string Description { get; set; } // 變動說明 11 12 public virtual Student Student { get; set; } // 關聯學生 13 14 public abstract void SetDescription(string desc); // 設置變動說明 15 } 16 17 /// <summary> 18 /// 學生教學班變動記錄 19 /// </summary> 20 public class StudentSchoolClassUpdateLog : StudentUpdateLog 21 { 22 public SchoolClass OrogianlSchoolClass { get; set; } // 原來班級 23 public SchoolClass CurrentSchoolClass { get; set; } // 當前 24 25 public StudentSchoolClassUpdateLog() 26 { 27 this.ID = Guid.NewGuid(); 28 this.UpdateTime = DateTime.Now; 29 } 30 31 /// <summary> 32 /// 若是在抽象類中定義了方法,那麼必須在它的派生類中實現 33 /// </summary> 34 /// <param name="desc"></param> 35 public override void SetDescription(string desc) 36 { 37 this.Description = desc; 38 } 39 }
接口類3d
(接口包含類或結構能夠實現的一組相關功能的定義)code
。接口相似於抽象基類。實現接口的任何類或接口多必須實現其全部成員。
。接口沒法直接進行實例。其成員由實現接口的任何類或接口來實現。
。接口能夠包含事件、索引器、方法和屬性。
。一個類或結構能夠實現多個接口。
。一個類能夠繼承一個基類,還能夠實現一個或多個接口。
1 /// <summary> 2 /// 用於描述相等性的接口 3 /// </summary> 4 /// <typeparam name="T">待指定類型的類型</typeparam> 5 public interface IEquatable<T> 6 { 7 string GetMake(); // 獲取製造商 8 string GetModle(); // 獲取類型 9 string GetYear(); // 獲取年份 10 11 /// <summary> 12 /// 只定義方法、返回值、參數、沒有定義任何具體的實現 13 /// </summary> 14 /// <param name="obj">T所限定類型的對象</param> 15 /// <returns></returns> 16 bool Equals(T obj); 17 } 18 19 public class Car : IEquatable<Car> 20 { 21 public string Make { get; set; } 22 public string Modle { get; set; } 23 public string Year { get; set; } 24 25 public Car(string make,string modle,string year) 26 { 27 this.Make = make; 28 this.Modle = modle; 29 this.Year = year; 30 } 31 32 // 實現 IEquatable<T> 接口 33 public bool Equals(Car obj) 34 { 35 if (this.Make == obj.Make && this.Modle == obj.Modle && this.Year == obj.Year) 36 return true; 37 else 38 return false; 39 } 40 41 // 實現接口類 IEquatable<T> 的成員方法 42 public string GetMake() 43 { 44 return Make; 45 } 46 47 public string GetModle() 48 { 49 return Modle; 50 } 51 52 public string GetYear() 53 { 54 return Year; 55 } 56 } 57 58 /// <summary> 59 /// 接口類的實現 60 /// </summary> 61 public static class InterfaceClass 62 { 63 public static void ToInterface() 64 { 65 // 建立 Car 實例 66 Car car1 = new Car("寶馬", "跑車", "2017"); 67 Car car2 = new Car("寶馬", "跑車", "2016"); 68 bool b= car1.Equals(car2); 69 if (b == true) 70 Console.WriteLine("相同"); 71 else 72 Console.WriteLine("額不相同"); 73 74 // 聲明一個轉型的 IEquatable,沒有建立 75 IEquatable<Car> hehe = (IEquatable<Car>)car1; 76 77 Console.WriteLine("Make:{0},Model{1},Year{2}", car1.Make, car1.Modle, car1.Year); 78 79 Console.WriteLine("hMake:{0},hModel{1},hYear{2}", hehe.GetMake(), hehe.GetModle(), hehe.GetYear()); 80 81 Console.ReadKey(); 82 } 83 }