Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
IDevManager?class TemperatureDisplay
{
public TemperatureDisplay(TemperatureSensor sensor)
{
mySensor = sensor;
}
}
class AllSensorInfoDisplay
{
public AllSensorInfoDisplay(IEnumerable<IDevice> allSensors)
{
/// ...
}
}
interface IPositionedDevice : IDevice {
Position GetPosition();
}
IEnumerable<IPositionedDevice> — и мы получим все устройства с позицией.IEnumerable<IDevice> или IEnumerable<IPositionedDevice>. В списке присутствуют классы, реализующие эти интерфейсы и дополняющие их своими специфическими методами(читай — новыми). Как Вы получите в C# доступ к этим специфическим методам, если они даже не объявлены в интерфейсе? В C++ — это dynamic_cast/static_cast к нужному типу (приведение к типу). Я как раз от этого и пытался уйти-)class ClientToCallSomeSpecificMethod
{
public ClientToCallSomeSpecificMethod(DeviceWithVerySpecificMethod device)
{
device.SpecificMethod();
}
}
DeviceWithVerySpecificMethod? Как изменится Ваш код? Будем передавать в конструктор сразу несколько DeviceWithVerySpecificMethod? Или воспользуемся коллекцией?public ClientFor2SpecificDevices(DeviceWithSpecificMethod1 dev1, DeviceWithSpecificMethod2 dev2) {
dev1.Method1();
dev2.Method2();
}
public ClientFor2SpecificDevices(IEnumerable<DeviceWithSpecificMethod1> devList1, IEnumerable<DeviceWithSpecificMethod2> devList2) {
foreach(var dev1 in devList1) {
dev1.Method1();
}
foreach(var dev2 in devList2) {
dev2.Method2();
}
}
IEnumerable<IDevice>//некоторый entry point вашего приложения:
var container = new Container();
container.Register<DeviceWithSpecificMethod1>().AsSelf().AsImplementedInterfaces().SingleInstance();
container.Register<DeviceWithSpecificMethod2>().AsSelf().AsImplementedInterfaces().SingleInstance();
container.Register<ClientFor2SpecificDevices>().AsSelf().AsImplementedInterfaces().SingleInstance();
container.Build();
// гдето в другом месте
ClientFor2SpecificDevices client = container.Resolve<ClientFor2SpecificDevices>();
// здесь вы получили ваш клиент, в который автоматически попали нужные устройства, заметьте, вы нигде не написали new
v4.callMethod<1, int>(0, 1);
v4.callMethod<0, int>(10, 31);
v4.callMethod1(0, 1);
v4.callMethod0(10, 31);
Variadic Templates, Low Coupling и немного размышлений