0

我正在尝试制作一个 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# 领域,导入库的使用者只需要做比他们应该做的更多的显式转换。还有其他我忽略的缺点吗?

4

1 回答 1

1

当前不支持接口继承。它将在未来的版本中修复。

你可以定义:

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

It does mean you'll end up having to define all members, even if stubs in C.

I haven't looked at Dojo in any depth, but potentially a better strategy will be to have a base class with methods shared across many of the widgets, and then derived widget types for each individual widget type. That would be something similar to the jQueryUI stuff that is in the script# repository.

于 2013-01-11T22:13:00.477 回答