我試圖做一個腳本#導入庫來包裝(部分)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中,導入庫的用戶只需要做更多的明確的轉換,而不是他們應該做的。還有其他的缺點,我忽略了嗎?
很高興知道我不只是做錯了。我最終可能會結合你的方法和上面顯示的版本。這似乎工作,但我需要爲其提供某種自動化。另一方面,簡單地增強Script#可能會減少工作量(並且更有價值)。您能否指出我在Script#類中的哪個類可能包含該問題?如果你能讓我到正確的地區,我可以從那裏去。 – Emdot
將在您創建的github問題上回復此問題... –