隨著Java8推出,新增了一堆新特性。其中有一項就是C# 3.0有的Extension Method。紀錄一下。
問題 在OOP的世界裡,一旦介面推出之後,就不能在更改了。否則依賴於這介面開發的程式必須更著改動。如果Source Code都在自己手上還好。如果是3rd party或是已不在維護的Library,這就變成問題。
1 2 3 4 5 6 7 8 9 public interface MyInterface { void myFunc(); } public class Obj1 implements MyInterface { public void myFunc() {} } public class Obj2 implements MyInterface { public void myFunc() {} }
如果如果現在Interface需要增加一個myFunc2的功能,該怎麼作。
以前的WIndows COM就有一個解法了,不過這方法現在很少使用了。除了Windows的影響力大不如前之外,要處理的東西還真不少,因此才有下面兩種方式出現。
1 2 3 4 5 6 7 8 9 10 11 12 13 struct IX1 { virtual void myFunc() = 0; }; struct IX2 { virtual void myFunc() = 0; virtual void myFunc2() = 0; }; IX1* pIX1 = NULL; IX2* pIX2 = NULL; HRESULT hr = pI->QueryInterface(IID_IX2, (void**)&pIX2); if (FAILED(hr)) { hr = pI->QueryInterface(IID_IX1, (void**)&pIX1); }
C-Sharp版 1 2 3 4 5 6 7 8 9 10 11 12 interface MyInterface { void myFunc(); } class Obj1 : MyInterface { public void myFunc() {} } public static class ExtensionMethods { public static void myFunc2(this MyInterface value) {} }
Java8版 Java8新增了default
這個關鍵字,可以在現有的Interface上新增函數,不過這就打破以往的認知,在Java7之前,interface是不能有任何具體程式碼的存在。
1 2 3 4 public interface MyInterface { void myFunc(); default void myFunc2() {} }