РЕДАКТИРОВАТЬ: Поцарапать все под строкой - согласно комментариям, это, вероятно, не то, что вы хотите.
К сожалению, mixins недоступны в качестве встроенной языковой функции в C#, кроме как с помощью некоторых сомнительных методов, включая инструменты для компиляции, такие как PostSharp. Некоторые инструменты IoC также могут создавать похожие на микширование вещи (см. Best implementation of INotifyPropertyChange ever).
К пункту @ 32bitkid вы можете написать extension methods. Они не являются интерфейсами, но они позволяют применять реализацию поведения к типу извне этого типа. Например, вы можете написать:
public static class IPersonExtensions {
// Note use of this keyword
public static Int32 GetAge(this IPerson p) { return DateTime.Now - p.BirthDate; }
}
затем использовать его таким образом:
var p = new Person(...);
var pAge = p.GetAge();
Да, как интерфейсы, как правило, используется- хотя они получают .cs файлы, не .h файлы. Вы можете определить интерфейс в собственном файле, как класс, а затем объявить класс как реализацию интерфейса.
Например, в IFoo.cs:
public interface IFoo {
public String Bar { get; set; }
}
, а затем в ConcreteFoo.cs:
public class ConcreteFoo : IFoo {
// This property implements IFoo.Bar
public String Bar { get; set; }
}
(Это пример auto-implemented property кстати)
IFoo даже не обязательно должен быть в собственном файле - он может быть в любом файле .cs. По соглашению, он обычно находится в его собственном, хотя. Также обратите внимание на соглашение об использовании префикса I для интерфейсов.
Вы можете прочитать больше об этом, вот например: http://www.csharp-station.com/Tutorials/Lesson13.aspx
У меня нет времени, чтобы написать реальный ответ, но интерфейсы могут иметь методы расширения. Это может соответствовать тому, что вы ищете, но это зависит от того, что вы пытаетесь сделать. –
@ 32bitkid Спасибо, я посмотрю. – mihajlv
Если методы расширения не вырезают его в вашем случае, попробуйте разложить реализацию интерфейса в отдельный класс, который будет содержать ссылку на обернутый объект одного из ваших нескольких классов. В зависимости от того, что вы пытаетесь сделать, вы можете предоставить доступ к вашему обернутому объекту, например. через 'IServiceProvider'. –