Мне нравится техника создания методов расширения для интерфейсов для обеспечения функциональности по умолчанию.Одно из мест, где это очень удобно, - положить немного мяса на фиктивные классы для юнит-тестов.
Например,
public interface IEmployee
{
IAddress Address { get; set; }
IAddress GetAddress();
void SetAddress(IAddress address);
}
public class Employee : IEmployee
{
// Complex production stuff here (causes DB access)
}
public class TestEmployee : IEmployee
{
// Simple unit testing stuff goes here (in memory only)
}
public static class EmployeeExtensions
{
public static IAddress GetAddress(this IEmployee employee)
{
// Some sort of magic (maybe using IOC)
// 'employee' can be either of type 'Employee' or of type 'TestEmployee'
}
public static void SetAddress(this IEmployee employee, IAddress address)
{
// Again with the magic
}
}
Хорошо, может быть, не лучший пример, но вы поняли...
Ключ в том, что GetAddress и SetAddress могут вызываться как для Employee, так и для TestEmployee без поддержки кода ни одним из них.К сожалению, это больше похоже на Java, чем на C #.То, что я действительно хотел бы сделать для обоих, это работать напрямую со свойством Address и заставлять его выполнять ту же магию, что и методы.Чего я хочу избежать, так это писать код в конкретных классах (особенно в TestEmployee).
Есть ли способ предоставить реализации по умолчанию для свойства Address IEmployee?
Я знаю, что свойства C # на самом деле являются методами под капотом.В любом случае, как-нибудь обеспечить реализацию для них?
Может ли это быть сделано на другом языке .NET?