2010-05-15 53 views
1

想象有通過合成圖案佈置的兩個接口,它們中的一個其它方法中的dispose方法:動作-3:重構接口繼承擺脫曖昧參考誤差的

interface IComponent extends ILeaf { 
    ... 
    function dispose() : void; 
} 

interface ILeaf { 
    ... 
} 

一些實現方式中有更多的一些共同的東西(比如一個id),所以有兩個接口:

interface ICommonLeaf extends ILeaf { 
    function get id() : String; 
} 

interface ICommonComponent extends ICommonLeaf, IComponent { 
} 

到目前爲止好。但其中也有一個dispose方法另一個界面:

interface ISomething { 
    ... 
    function dispose() : void; 
} 

ISomething由ICommonLeaf繼承:

interface ICommonLeaf extends ILeaf, ISomething { 
    function get id() : String; 
} 

只要dispose方法在其上實現了​​接口的實例調用時,由於ISomething有一個名爲dispose的方法,並且ILeaf也有一個dispose方法,它們都生活在不同的接口中(IComponent, ISomething)在ICommonComponent的繼承樹中。

我不知道如何處理,如果

  • IComponentILeafISomething不能改變這種狀況。
  • 該複合結構還必須努力爲ICommonLeaf &​​
  • 實現和ICommonLeaf &​​必須符合ISomething類型。

這可能是一個actionscript-3特定問題。我還沒有測試過其他語言(例如java)如何處理這樣的東西。

回答

3

您正在尋找鑽石問題的解決方案。 C#有一個方法來解決這個問題,但基本上我會將這個方法從接口中「處置」出來,並創建一個新的「IDisposable」。

如果像「id」這樣的相同名稱使用了兩次,它看起來像是一個模糊名稱的代碼中的問題。我們開始爲屬性和方法添加前綴。想象一下,你有一個屬性「名字」屬於兩個不同的東西。像「displayName」和「uniqueName」一樣。

這也有助於自動完成。如果一個DisplayObject是一個ILayoutObject,並且你輸入displayObject.layout,你可以得到一切相關的佈局。

+0

是的,IDisposable接口肯定能解決這個問題,但不幸的是我沒有訪問IComponent和ISomething接口來提取dispose。 – maxmc 2010-05-16 12:32:00

+0

+1爲鑽石問題提示 – maxmc 2010-05-16 12:33:43

0

據我所知,在Actionscript中沒有很好的方法來處理這個問題。

我能想到的唯一的事情就是重構你的接口以避免名稱衝突,而且,這並不總是可能的。

不知道Java,但C#有辦法通過explicit interface implementation來處理這個問題。

1

看起來鑄造解決了歧義,即使它很不整齊。

class SomeComponent implements ICommonComponent {} 

var c : ICommonComponent = new SomeComponent(); 
trace(ISomething(c).dispose()); //compiles 
trace(IComponent(c).dispose()); //compiles 
trace(c.dispose()); //fails