顯式與隱式(Explicit And Implicit) 1.概念 1.1 顯式 實現的單詞Explicit意思是清楚的、明確的、詳述的。所以,顯式的“顯”是指明顯且清楚的實現,相對於介面來說,就是明顯而清楚的指定了介面的實現。對於其他的邏輯來說,顯式就是清楚且明確的指定了實現內容。 1.2 隱式 ...
顯式與隱式(Explicit And Implicit)
1.概念
1.1 顯式
實現的單詞Explicit意思是清楚的、明確的、詳述的。所以,顯式的“顯”是指明顯且清楚的實現,相對於介面來說,就是明顯而清楚的指定了介面的實現。對於其他的邏輯來說,顯式就是清楚且明確的指定了實現內容。1.2 隱式
實現的單詞Implicit意思是隱匿的、不言明的、絕對的。所以,隱式的實現是指想當然的實現,相對於介面來說,只要實現類的方法簽名和返回值與介面定義的一致即視為介面的實現,並無顯式的(清晰的、明確的)指定。2.例子
2.1 代碼
1 using System; 2 namespace ExplicitAndImplicit{ 3 //刀子 4 public interface IKnife{ 5 void KillPeople(); 6 } 7 //槍 8 public interface IGun{ 9 void KillPeople(); 10 } 11 //隱式實現 12 public class WrongKillMachine:IKnife,IGun{ 13 public void KillPeople(){ 14 Console.WriteLine("切切切腦袋"); 15 } 16 } 17 //顯式實現: 18 //1.實現介面方法不需要加訪問定義符 19 //2.實現介面方法前面要加介面名.方法名,用來指定其實現的介面 20 //2.實現介面方法只能被顯式的調用,不能被隱式的調用: 21 // 顯式調用: 22 public class KillMachine:IKnife,IGun{ 23 void IKnife.KillPeople(){ 24 Console.WriteLine("切切切"); 25 } 26 void IGun.KillPeople(){ 27 Console.WriteLine("啪啪啪"); 28 } 29 } 30 public static class Case 31 { 32 public static void Begin(){ 33 Console.WriteLine("Design Pattern —— Explicit And Implicit:"); 34 //隱式實現 35 WrongKillMachine w = new WrongKillMachine(); 36 w.KillPeople(); 37 38 //顯式實現 39 IKnife k = new KillMachine(); 40 k.KillPeople(); 41 IGun g = new KillMachine(); 42 g.KillPeople(); 43 } 44 } 45 }
2.2 結果
2.3 例子解釋
2.3.1 隱式
實現即為WrongKillMachine類,並沒有指定每個介面的實現方法,而是通過一個簽名與返回值一致的方法來隱式實現(Implicit、不言明的、絕對的、隱匿的)。2.3.2 顯式
的實現即為KillMachine類,指定了每個介面實現的方法(KillPeople),相較於隱式的實現,它更加的清晰、明確、詳述。2.4 結合上面的例子寫一個小故事
殺手跟他的助手說:“給我來一個能殺人的家伙”; “用這個吧!”,助手從包里拿出了一個又像刀又像槍的家伙“這個是研究所剛剛給咱們研發的武器,外號殺人機器(KillMachine)‘要你命3000’,它集成了手槍與刀子的能力” “怎麼用呢?”殺手一知半解 “只要喊出語音指令‘KillPeople’,程式會自動執行的。” “OK!”殺手尾隨它的目標來到車庫,突然之間將無辜的John踢倒,用手鎖住他的關節和身體並將自身的重量轉移到上面,讓John動彈不得。隨後,他拿出了YaoNiMing3000,握住手柄, 慢慢的將槍口對準了John的心臟,心中默默為這位無辜的人祈禱著。“阿門......”。 "K-I-L-L,P-E-O-P-L-E!",響亮的吼聲在無人的車庫中迴蕩,John緊閉著雙眼等待著死亡的來臨。 “咔咔咔噠噠”,隨著要你命3000中機械齒輪發出的聲音,從槍口中“嗖”的一下,彈出一個一公分長的小刀。 John懵逼了。Σ( ° △ °|||)︴ 殺手也懵逼了。Σ( ° △ °|||)︴
事後得知,是研發的博士讓機器隱式實現了KillPeople方法,導致在調用的時候沒有分開到底是具體哪一個功能的實現,結果功能都寫到了一起,搞出了這個笑話。 所以,他將WrongKillMachine類停用,換成了KillMachine類,調用時也直接採用其抽象介面進行調用,這樣就避免了一系列的問題,後期修改代碼也更加方便了。
3.其他認證
3.1 關於一個類多個介面的實現既有顯式也有隱式的規則(混合)
using System; namespace ExplicitAndImplicit { public interface InfA{ void Do(); } public interface InfB{ void Do(); } public interface InfC{ void Do(); } public interface InfD{ void Do(); } public class Class1:InfA,InfB,InfC,InfD{ void InfA.Do(){ Console.WriteLine("A"); } void InfB.Do(){ Console.WriteLine("B"); } public void Do(){ Console.WriteLine("C"); } } //測試目的是看多個介面實現是否可以部分顯式、部分隱式,答案是肯定的 //同樣,顯式介面必須通過介面的聲明實現 比如 Interface i = new Class(); public static class Case2_TestMultiIntegration{ public static void Begin(){ Utility.UnitStart(3,"1.2.1 Implicit-通過隱式方式調用隱式實現的藉口 Class c = new Class(); c.DoMethod();"); Class1 c = new Class1(); c.Do(); Utility.UnitStart(3,"1.2.2 Explicit-通過顯式方式調用顯式方式實現的藉口 Interface i = new Class(); i.DoMethod();"); InfA a = new Class1(); a.Do(); Utility.UnitStart(3,"1.2.3 MixedImplicit-通過顯式方式調用隱式實現的介面 Interface i = new Class(); i.DoMethod();"); InfD d = new Class1(); d.Do(); } } }