在 C# 中,最接近 C++ 风格的 mixins 是将 mixins 添加为类的字段并向类添加一堆转发方法:
public class MyClass
{
private readonly Mixin1 mixin1 = new Mixin1();
private readonly Mixin2 mixin2 = new Mixin2();
public int Property1
{
get { return this.mixin1.Property1; }
set { this.mixin1.Property1 = value; }
}
public void Do1()
{
this.mixin2.Do2();
}
}
如果您只想导入 mixins 的功能和状态,这通常就足够了。mixin 当然可以随心所欲地实现,包括(私有)字段、属性、方法等。
如果您的班级还需要表达与 mixins 的“is-a”关系,那么您需要执行以下操作:
interface IMixin1
{
int Property1 { get; set; }
}
interface IMixin2
{
void Do2();
}
class MyClass : IMixin1, IMixin2
{
// implementation same as before
}
(这也是 C# 中模拟多重继承的标准方式。)
当然,mixin 接口和mixin 类可以是泛型的,例如具有最派生类参数或其他。