1

我来自 C#/F#/Haskell,所以我试图为我习惯于使用类型解决的编程问题提出解决方案。

  1. class A where T : new() 在 C# 中,这主要是我可以在某处做 new T()。这会在 Dart 中创建格式错误的类型错误。有没有一种合理的惯用方法来解决这个问题?也许与工厂?

  2. 我对 mixin 做了一些实验,在继承的 mixin 成员的名称冲突的情况下,最后一个 mixin 获胜。因此对于以下内容:抽象类 mixA { void foo(); } 抽象类 mixB { void foo(); } 类 C 扩展 Object 与 mixA, mixB {} new C().foo();

这最终会调用 mixB.foo() 而类 C 使用 mixB 扩展 Object,mixA {} 最终会调用 mixA.foo() 无论如何可以访问隐藏的 mixins 的成员吗?

假设我将 2 个 mixin 与同名字段混合。子类实例在运行时是否有 2 个字段(只有 1 个是不可访问的)或者对象是否像字典并且每个名称只有 1 个插槽?

4

1 回答 1

5

1是不可能的。您不能调用new泛型类型(或变量)。最常见的解决方法是创建一个分配对象的闭包。

2 的答案源于 Mixins 可以被视为超类的事实:A extends Object with B, C基本上等同于:

class B' extends Object { <copy over code inside B> }
class C' extends B' { <copy over code inside C> }
class D extends C' { ... }

考虑到这一点:

  • 不。无法访问隐藏的超级元素。
  • 是的。你最终会得到多个字段。

小提示:该<copy over code inside X>部分并不完全正确,因为这会改变库范围。mixin B 中的代码在概念上位于声明 mixin 的库中。

于 2013-05-02T21:54:56.950 回答