這個問題困擾了我很久,很覺得設計的不完善,終於在今天把它徹底解決了,其實就是一個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()方法,就正常了,呵呵,原來是子類接口沒有繼承統一操作接口的問題呀!
下面是實例的完整代碼,供大家參考:

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 }