Вы можете использовать шаблон, подобный следующему:
public interface ICommonServices
{
string SomeProperty { get; set; }
void SomeMethod(string param);
}
public static class CommonServiceMethods
{
public static void DoSomething(this ICommonServices services, string param)
{
services.SomeMethod(services.SomeProperty + ": " + param + " something extra!");
}
}
Все классы, которые реализуют ICommonServices, теперь также получают некоторое бесплатное поведение через метод расширения, который зависит только от тех функций, которые доступны всем реализаторам ICommonServices.Если вам нужен доступ к функциональности базового класса, вы можете поместить его в свой собственный интерфейс, и ICommonServices также реализует этот интерфейс.Теперь вы можете создавать функциональные возможности расширения «по умолчанию» для интерфейсов, не используя несколько базовых классов.
EDIT
Если вы хотите, чтобы некоторые из этих методов были внутренними, вы можете изменитьшаблон, подобный следующему:
public class MyObject : IServices
{
public string PublicProperty { get; private set; }
string IServices.SomeProperty { get; set; }
void IServices.SomeMethod(string param)
{
//Do something...
}
}
public interface IPublicServices
{
string PublicProperty { get; }
}
internal interface IServices : IPublicServices
{
string SomeProperty { get; set; }
void SomeMethod(string param);
}
internal static class ServiceMethods
{
public static void DoSomething(this IServices services, string param)
{
services.SomeMethod(services.SomeProperty + ": " + param + " something extra!");
}
}
В основном мы представляем как открытый, так и внутренний интерфейсы.Обратите внимание, что мы реализуем методы внутреннего интерфейса явно, поэтому методы не доступны для общего пользования (поскольку общедоступный клиент не может получить доступ к типу интерфейса.) В этом случае вспомогательные методы расширения являются внутренними, полагаясь навнутренний интерфейс, хотя вы также можете создавать общедоступные вспомогательные методы, основанные на общедоступном интерфейсе.