Как люди получают повторное использование в стиле mixin в C#?
Я пришел из C++ фона, где я могу использовать шаблонные миксины для написания кода, который ссылается на FinalClass, который является передаваемым параметром шаблона. Это позволяет многократно использовать функции, которые "смешиваются" с любым производным классом, просто наследуя от ReusableMixin с параметром шаблона MyFinalClass. Все это вписывается в класс, как будто я просто написал большой класс, который сделал все - то есть очень быстро! Поскольку миксины могут соединяться, я могу смешивать все виды поведения (и состояния) в одном объекте.
Если кто-то хочет получить разъяснения по технике, пожалуйста, спросите. У меня вопрос, как я могу получить такое повторное использование в C#? Примечание. Обобщения C# не позволяют наследовать от обобщенного параметра.
5 ответов
В 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 могут быть обобщенными, например, с параметром самого производного класса или любым другим.
Вы можете использовать интерфейсы и методы расширения. Например:
public interface MDoSomething // Where M is akin to I
{
// Don't really need any implementation
}
public static class MDoSomethingImplementation
{
public static string DoSomething(this MDoSomething @this, string bar) { /* TODO */ }
}
Теперь вы можете использовать миксины, наследуя их от MDoSomething. Помните, что использование методов расширения внутри (this) класса требует спецификатора this. Например:
public class MixedIn : MDoSomething
{
public string DoSomethingGreat(string greatness)
{
// NB: this is used here.
return this.DoSomething(greatness) + " is great.";
}
}
public class Program
{
public static void Main()
{
MixedIn m = new MixedIn();
Console.WriteLine(m.DoSomething("SO"));
Console.WriteLine(m.DoSomethingGreat("SO"));
Console.ReadLine();
}
}
НТН.
В C# вы можете использовать "частичное" ключевое слово, чтобы указать, что ваш класс реализован в нескольких исходных файлах. Затем вы можете использовать небольшой шаблонизатор для автоматической генерации дополнительных файлов исходного кода, которые содержат методы, которые вы хотите внедрить в свой класс.
Для этого можно использовать шаблонизатор T4, включенный в Visual Studio, но можно использовать более упрощенный подход. Смотрите мой собственный движок шаблонов: http://myxin.codeplex.com/
Проверьте библиотеку ремиксов для.net на http://remix.codeplex.com/
Эта библиотека приносит миксины в.NET