В C # ближе всего к миксинам в стиле C ++ добавляются миксины в качестве полей класса и добавляется куча методов пересылки в класс:
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();
}
}
Этого обычно достаточно, если вы хотите импортировать только функциональность и состояние миксинов. Конечно, миксин может быть реализован как угодно, в комплекте с (приватными) полями, свойствами, методами и т. Д.
Если вашему классу также необходимо выразить отношения "is-a" с миксинами, вам нужно сделать следующее:
interface IMixin1
{
int Property1 { get; set; }
}
interface IMixin2
{
void Do2();
}
class MyClass : IMixin1, IMixin2
{
// implementation same as before
}
(Это также стандартный способ эмуляции множественного наследования в C #.)
Конечно, интерфейсы mixin, а также классы mixin могут быть обобщенными, например, с наиболее производным параметром класса или чем-то еще.