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