Допустим, есть 3 интерфейса:
Какой-то класс хранит в себе экземпляр 3-го интерфейса.
И я хочу, что бы в классе было свойство, которое возвращает 3-ий интерфейс, но пониженный до 1-го.
Собственно вопрос:
А я должен боятся того, что кто-то за пределами моего класса выполнит повышающее преобразование и получат интерфейс под номером 3 и получат доступ к методам, которые могут поломать все?
Если порассуждать, то даже если я спрячу данные в отдельный класс и буду возвращать его, то в теории, если юзер захочет, то он может хакнуть все через рефлексию- это конечно будет чуть труднее, но реализуемо.
Допустим, есть 3 интерфейса
public interface IInterface1
{
void Method1();
}
public interface IInterface2
{
void Method2();
}
public interface IInterface3
{
void Method3();
}
и общий интерфейс
public interface IInterfaceComon : IInterface1, IInterface2, IInterface3 {}
Класс, что всё реализует
private class MyClass : IInterfaceComon
{
public void Method1(){}
public void Method2(){}
public void Method3(){}
}
Декораторы
private class Decor1 : IInterface1
{
private IInterface1 _inner;
public Decor1(IInterface1 inner)=>_inner = inner;
public void Method1()=> _inner.Method1();
}
private class Decor2 : IInterface2
{
private IInterface2 _inner;
public Decor2(IInterface2 inner) => _inner = inner;
public void Method2() => _inner.Method2();
}
private class Decor3 : IInterface3
{
private IInterface3 _inner;
public Decor3(IInterface3 inner) => _inner = inner;
public void Method3() => _inner.Method3();
}
Логика
public class MyLogic
{
public IInterface1 GetInterfce1(){
return new Decor1(new MyClass());
}
public IInterface2 GetInterfce2()
{
return new Decor2(new MyClass());
}
public IInterface3 GetInterfce3()
{
return new Decor3(new MyClass());
}
}
Вот и всё, никакие касты не помогут, но если клиент заморочился рефлексией - то он сам себе создает проблемы.
Сами декораторы будут меняться с такой же частотой, как и интерфейсы, то есть максимально редко. Один раз написал и забыл.
Отмечу, что это просто защита от дурака, её писать не обязательно, но если вы ожидаете много пытливых клиентов, то желательно. В идеальном мире клиенты не должны кастить ничего из ваших классов, так как в таком случае они не следуют контракту вашего класса, а делают какие то предположения о вашем классе.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Подскажите в чем может быть проблема, вылетает ошибка при миграции на добавление связи между таблицами
У меня есть проверка такого рода GetName если находит подходящую строчку в тексте path то возвращает определённый текст
В общем, отлаживал библиотекурешил поставить музыку которая идет в потоке на паузу, и отойти на минут 10