2013-01-11 65 views
0

我試圖做一個腳本#導入庫來包裝(部分)dojo工具包 - 特別是dijit小部件。不幸的是,dojo使用多重繼承,而C#不支持(除了接口,Script#不能正確處理 - 見下文)。腳本中的多重繼承#

我試圖完成這樣的事情:

[Imported] 
public class A 
{ 
    public void Foo() {} 
} 
[Imported] 
public class B 
{ 
    public void Bar() {} 
} 
[Imported] 
public class C : A, B 
{ 
    public void Sproing() {} 
} 

但顯然,這不是有效的C#,因此是無效的腳本#。

腳本中是否存在一種方法來適應[Imported]類的多重繼承?我嘗試使用接口,因爲C#支持它們的多重繼承,而且我也不提供實現: [Imported] public interface A void Foo();公共接口B void Bar();公共接口C:A,B {Sprinding();但是,當我嘗試使用另一個Script#項目的庫時,例如C c = null; c.Foo();等代碼,我只是得到一個「Check that your C#source compiles that you're not using a unsupported feature。Common things to check for include use的完全限定名稱(使用using語句來代替導入名稱空間)或從相同類型的靜態成員中訪問類型的私有成員。「撥打c.Foo()時出錯。

還有其他想法嗎? [Mixin]屬性似乎沒有做我所需要的。

我目前看到的唯一其他選項(除了修復腳本#中的接口問題,我不打算這麼做)是徹底拋棄繼承,並將所有 「繼承」成員放在每個葉中類。這將是這個樣子:

[Imported] 
public class A 
{ 
    public void Foo() {} 
} 
[Imported] 
public class B 
{ 
    public void Bar() {} 
} 
[Imported] 
public class C 
{ 
    public void Foo() {} 
    public void Bar() {} 
    public void Sproing() {} 
} 

顯然會變得醜陋快,但我可以自動執行它。由於JavaScript的類型系統無論如何都相當快速和鬆散,所以這甚至可以在那裏運行。而且在Script#land中,導入庫的用戶只需要做更多的明確的轉換,而不是他們應該做的。還有其他的缺點,我忽略了嗎?

回答

1

當前不支持接口繼承。它將在未來的版本中修復。

您可以定義:

interface A { 
} 
interface B { 
} 
class C : A, B { 
} 

它意味着你將最終不得不定義所有成員,即使在C.

存根我沒有任何深度看着道場,但是更好的策略可能是擁有一個基類,其中包含許多小部件共享的方法,然後爲每個單獨的小部件類型派生小部件類型。這將與腳本#存儲庫中的jQueryUI相似。

+0

很高興知道我不只是做錯了。我最終可能會結合你的方法和上面顯示的版本。這似乎工作,但我需要爲其提供某種自動化。另一方面,簡單地增強Script#可能會減少工作量(並且更有價值)。您能否指出我在Script#類中的哪個類可能包含該問題?如果你能讓我到正確的地區,我可以從那裏去。 – Emdot

+0

將在您創建的github問題上回復此問題... –