Страницы

Поиск по вопросам

воскресенье, 5 января 2020 г.

Стоит ли боятся DownCast'а(конкретизация типа)?

#c_sharp #net


Допустим, есть 3 интерфейса:


Список свойств
Список методов
Наследуется от 2-ух интерфейсов


Какой-то класс хранит в себе экземпляр 3-го интерфейса.

И я хочу, что бы в классе было свойство, которое возвращает 3-ий интерфейс, но пониженный
до 1-го.

Собственно вопрос:

А я должен боятся того, что кто-то за пределами моего класса выполнит повышающее
преобразование и получат интерфейс под номером 3 и получат доступ к методам, которые
могут поломать все?

Если порассуждать, то даже если я спрячу данные в отдельный класс и буду возвращать
его, то в теории, если юзер захочет, то он может хакнуть все через рефлексию- это конечно
будет чуть труднее, но реализуемо.
    


Ответы

Ответ 1



Допустим, есть 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()); } } Вот и всё, никакие касты не помогут, но если клиент заморочился рефлексией - то он сам себе создает проблемы. Сами декораторы будут меняться с такой же частотой, как и интерфейсы, то есть максимально редко. Один раз написал и забыл. Отмечу, что это просто защита от дурака, её писать не обязательно, но если вы ожидаете много пытливых клиентов, то желательно. В идеальном мире клиенты не должны кастить ничего из ваших классов, так как в таком случае они не следуют контракту вашего класса, а делают какие то предположения о вашем классе.

Комментариев нет:

Отправить комментарий