part01.01 C#基礎語法與邏輯控制(五)(7. C# 繼承和接口)

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     }
View Code

繼承的實際應用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     }
View Code

抽象類(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     }
View Code

接口類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     }
View Code
相關文章
相關標籤/搜索