我正在尝试制作一个 Script# 导入库来包装(部分)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#,因此不是有效的 Script#。
Script# 中有没有办法适应 [Imported] 类的多重继承?我尝试使用接口,因为 C# 支持它们的多重继承,而且我不提供实现: [Imported] public interface A { void Foo(); } [导入] 公共接口 B { void Bar(); } [导入] 公共接口 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# 领域,导入库的使用者只需要做比他们应该做的更多的显式转换。还有其他我忽略的缺点吗?