面向對象的故事~數據底層操作告訴了我們接口,抽象類,繼承與多態性的使用


這個問題困擾了我很久,很覺得設計的不完善,終於在今天把它徹底解決了,其實就是一個C#里的基礎知識問題,主要涉及到了,接口,抽象類,接口繼承,類繼承,多態等知識。

事件是這樣的,我有一個統一接口規范的接口,它可以由linq to sql,ado.net和ef等相關數據源去實現(只是舉個例,不是實際中的代碼)

 1     /// <summary>
 2     /// 數據統一接口規范
 3     /// </summary>
 4     interface ITest
 5     {
 6         /// <summary>
 7         /// 插入方法
 8         /// </summary>
 9         void Insert();
10     }

而在每一個子類中都去實現了這個接口,比如Testzzl這個實體,它去實現了這個ITest接口

 1    /// <summary>
 2     /// Testzzl實體操作
 3     /// </summary>
 4     class Testzzl :  ITestzzl
 5     {
 6         /// <summary>
 7         /// 子類也可以去復寫它
 8         /// </summary>
 9         public void Insert()
10         {
11             Console.WriteLine("子類實現Insert方法");
12         }
13     }

好了,這樣在使用時,可以定義接口類型的對象,通過具體的工具實現接口的多態性。

1   ITestzzl iTestzzl = new Testzzl();
2   iTestzzl.Insert();

 

這是我最初寫的代碼,我總覺得有些不爽,但又說不出來,我知道,我寫了很多重復的代碼,因為每個子類在實現Insert方法時,它們的代碼都是相同的,除非自己邏輯上有需要,再會

真正去實現它。

在一次技術討論中,終於被經理的所驚醒,“為何不把相同的實現邏輯放在一個基類中呢?”,於是,我改了一下代碼,它變成了這樣:

 1     /// <summary>
 2     /// 統一實體基類
 3     /// 子類共同的操作邏輯
 4     /// </summary>
 5     abstract class TestBase : ITest
 6     {
 7 
 8         #region ITest 成員
 9 
10         public virtual void Insert()
11         {
12             Console.WriteLine("基類統一實現Insert方法");
13         }
14 
15         #endregion
16     }

我們的子類去繼承TestBase后,它可以使用基類的Insert()方法,如果子類自己的邏輯有需要,還可以去復寫它,看似重復代碼的問題解決了,可又有一個問題來了,我們在業務層使用

數據庫對象時,一般會以接口對象進行聲明,因為它可以幫助我們實現操作的多態性,下面代碼出問題了

1  ITestzzl iTestzzl = new Testzzl();
2 
3  iTestzzl.Insert();

嘿,我們的Insert()方法,找不到了,這是為什么呢?原來在我們的ITestzzl接口中,並沒有定義這個方法,實事上,如果希望的ITest的接口應用到ITestzzl接口上,需要去繼承一個它,

於是ITestzzl接口變成了這樣:

1  interface ITestzzl : ITest {
2   // Testzzl實體的一些操作邏輯
3  }

 

這時,我們在去調用Insert()方法,就正常了,呵呵,原來是子類接口沒有繼承統一操作接口的問題呀!

下面是實例的完整代碼,供大家參考:

View Code
 1     /// <summary>
 2     /// 數據統一接口規范
 3     /// </summary>
 4     interface ITest
 5     {
 6         /// <summary>
 7         /// 插入方法
 8         /// </summary>
 9         void Insert();
10     }
11     /// <summary>
12     /// 統一實體基類
13     /// 子類共同的操作邏輯
14     /// </summary>
15     abstract class TestBase : ITest
16     {
17 
18         #region ITest 成員
19 
20         public virtual void Insert()
21         {
22             Console.WriteLine("基類統一實現Insert方法");
23         }
24 
25         #endregion
26     }
27     interface ITestzzl : ITest { }
28     /// <summary>
29     /// Testzzl實體操作
30     /// </summary>
31     class Testzzl : TestBase, ITestzzl
32     {
33         /// <summary>
34         /// 子類也可以去復寫它
35         /// </summary>
36         public override void Insert()
37         {
38             Console.WriteLine("子類實現Insert方法");
39         }
40     }
41 
42 class Program{
43  static void Main(string[] args)
44         {
45             ITestzzl iTestzzl = new Testzzl();
46 
47             iTestzzl.Insert();
48             Console.ReadKey();
49 }
50 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM