У меня есть интерфейс двигателя и различные реализации интерфейса, определяемые поставщиком c.
public interface IMotor
{
void Home();
void Move();
}
public class VenodorAMotor : IMotor
{
public void Home()
{ /*home motor*/ }
public void Move()
{ /*move motor*/ }
}
Я украшаю IMotor, чтобы добавить некоторые функциональные возможности в его домашний метод.
public class HomeAdjustmentDecorator : IMotor
{
private IMotor decoratedMtr;
public static explicit operator VendorAMotor(HomeAdjustmentDecorator mtr)
{ return (VendorAMotor)mtr.decoratedMtr; }
public HomeAdjustmentDecorator(IMotor mtr)
{
if(! mtr is VenodorAMotor)
throw new Exception("HomeAdjustmentDecorator can only decorate VenodorAMotor objects");
decoratedMtr = mtr;
}
public void Home()
{
decoratedMtr.Home();
double adjustment = ((VendorAMotor)myMotor).GetHomeAdjustment();//vendor-specific functionality
Log(adjustment);
}
public void Move()
{ decoratedMtr.Move(); }
}
У меня нет контроля над созданием VendorAMotor
, поэтому я не могу легко использовать наследование.
Проблема заключается в существующем коде, который уже переводит неокрашенный IMotor в свой реализующий класс для получения доступа к другим функциональным возможностям c, определяемым поставщиком. Приведение не выполняется, поскольку HomeAdjustmentDecorator не наследует VenodorAMotor.
IMotor myDecoratedMotor;//Implementation is HomeAdjustmentDecorator composed of VendorAMotor
...
((VendorAMotor)myDecoratedMotor).DoOtherVendorSpecificStuff();
Я попытался переопределить оператор приведения, как показано, но это не работает. Я получаю InvalidCastExeption: «Невозможно привести объект типа« HomeAdjustmentDecorator »к типу« VenodorAMotor ».»
Все компилируется нормально. Явное переопределение оператора приведения не выполняется, точка останова не достигает. Вопрос в том, не выполнен ли этот переопределение приведения?
Ближайший подобный вопрос я нашел здесь: Украшение с несколькими интерфейсами , но это не совсем помогает.
Я думаю, что ответ здесь: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/conversions#user -defined-Conversions но я думаю, что мне не хватает некоторых тонких деталей.