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

146
13 октября 2021, 01:20

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

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

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

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

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

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

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

Answer 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());
    }
}

Вот и всё, никакие касты не помогут, но если клиент заморочился рефлексией - то он сам себе создает проблемы.

Сами декораторы будут меняться с такой же частотой, как и интерфейсы, то есть максимально редко. Один раз написал и забыл.

Отмечу, что это просто защита от дурака, её писать не обязательно, но если вы ожидаете много пытливых клиентов, то желательно. В идеальном мире клиенты не должны кастить ничего из ваших классов, так как в таком случае они не следуют контракту вашего класса, а делают какие то предположения о вашем классе.

READ ALSO
конфликт при миграции Code First

конфликт при миграции Code First

Подскажите в чем может быть проблема, вылетает ошибка при миграции на добавление связи между таблицами

136
Как можно сформировать проверку на строку?

Как можно сформировать проверку на строку?

У меня есть проверка такого рода GetName если находит подходящую строчку в тексте path то возвращает определённый текст

216
Сборщик мусора собрал делегат который передавался в неуправляемый код, как этого не допустить?

Сборщик мусора собрал делегат который передавался в неуправляемый код, как этого не допустить?

В общем, отлаживал библиотекурешил поставить музыку которая идет в потоке на паузу, и отойти на минут 10

80