0

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# の世界では、インポート ライブラリの利用者は、必要以上に明示的なキャストを行う必要があります。私が見落としている他の欠点はありますか?

4

1 に答える 1

1

インターフェイスの継承は現在サポートされていません。将来のリビジョンで修正される予定です。

次のように定義できます。

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

これは、Cのスタブであっても、すべてのメンバーを定義する必要があることを意味します。

Dojoについては詳しく調べていませんが、多くのウィジェットでメソッドを共有する基本クラスを作成し、個々のウィジェットタイプごとにウィジェットタイプを派生させることをお勧めします。これは、script#リポジトリにあるjQueryUIのものに似ています。

于 2013-01-11T22:13:00.477 に答える