Dojo ツールキット、特に dijit ウィジェット (の一部) をラップする Script# インポート ライブラリを作成しようとしています。残念ながら、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# ではないため、有効な Script# ではありません。
[Imported] クラスの多重継承に対応する Script# の方法はありますか? C# はそれらの複数の継承をサポートしており、とにかく実装を提供していないため、インターフェイスを使用してみました: [Imported] public interface A { void Foo(); [インポート] public interface B { void Bar(); [インポート] public interface C : A, B { void Sproing(); ただし、別の Script# プロジェクトのライブラリを使用しようとするとC c = null; c.Foo();
、「C# ソースがコンパイルされ、サポートされていない機能が使用されていないことを確認してください。完全に修飾名 (代わりに using ステートメントを使用して名前空間をインポートする)、または同じ型の静的メンバーから型のプライベート メンバーにアクセスします。"c.Foo()
他のアイデアはありますか?[Mixin] 属性も、私が必要とすることをしていないようです。
現時点で私が目にする唯一の他のオプションは (Script# のインターフェイスの問題を修正することを除いて) 継承を完全に破棄し、すべての「継承された」メンバーを各リーフ クラスに配置することです。それは次のようになります。
[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# の世界では、インポート ライブラリの利用者は、必要以上に明示的なキャストを行う必要があります。私が見落としている他の欠点はありますか?