0%

Extension Methods in Java 8 / C#

隨著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 Solution

以前的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() {}
}