Вы должны посмотреть на инверсию управления:
В таком сценарии вы не будете писать это:
IInterface classRef = new ObjectWhatever();
Вы бы написали что-то вроде этого:
IInterface classRef = container.Resolve();
Это приведет к установке на основе правил в объекте container
и построит для вас фактический объект, который может быть ObjectWhatever. Важно то, что вы могли бы заменить это правило тем, что вообще использовали другой тип объекта, и ваш код все равно будет работать.
Если мы покинем IoC из таблицы, вы можете написать код, который знает, что это может разговаривать с объектом , который делает что-то конкретное , но не тот тип объекта или как он это делает.
Это было бы полезно при передаче параметров.
Что касается вашего вопроса в скобках «Также, как вы могли написать метод, который принимает объект, реализующий интерфейс? Возможно ли это?», на C # вы просто используете тип интерфейса для типа параметра, например:
public void DoSomethingToAnObject(IInterface whatever) { ... }
Это подключается прямо к «разговору с объектом, который делает что-то конкретное». Метод, определенный выше, знает, чего ожидать от объекта, что он реализует все на IInterface, но ему не важно, какой тип объекта он есть, только тот, который он придерживается в контракте, что является интерфейсом.
Например, вы, вероятно, знакомы с калькуляторами и, вероятно, использовали довольно много в свои дни, но большую часть времени они все разные. С другой стороны, вы знаете, как должен работать стандартный калькулятор, поэтому вы можете использовать их все, даже если вы не можете использовать специальные функции, которые каждый калькулятор имеет, что ни у кого нет.
Это красота интерфейсов. Вы можете написать фрагмент кода, который знает, что он получит переданные ему объекты, от которых он может ожидать определенного поведения. Ему не важно, какой именно объект он хочет, только потому, что он поддерживает требуемое поведение.
Позвольте мне привести конкретный пример.
У нас есть пользовательская система перевода окон. Эта система проходит через элементы управления в форме и преобразует текст в каждый. Система знает, как обрабатывать базовые элементы управления, такие как свойство type-of-of-control-that-a-Text-свойство и аналогичные базовые элементы, но для чего-то базового оно не подходит.
Теперь , поскольку элементы управления наследуют от заранее определенных классов, которые мы не контролируем, мы могли бы сделать одну из трех вещей:
Итак, мы сделали nr. 3. Все наши элементы управления реализуют ILocalizable, который является интерфейсом, который дает нам один метод, способность переводить «сам» в контейнер текста перевода / правил. Таким образом, форма не должна знать, какой вид управления она обнаружила, только то, что она реализует конкретный интерфейс, и знает, что существует метод, в котором он может вызвать локализацию элемента управления.
даже при подавлении вы все равно получите ложные срабатывания в среде выполнения OpenMP, потому что в среде выполнения есть некоторый механизм синхронизации, который Tsan не может понять.
Мы работали над временем выполнения OpenMP, чтобы сделать Tsan понять эти точки синхронизации и удалить все ложные срабатывания.
Взгляните на этот проект:
https://github.com/PRUNER/archer
Дайте мне знать, если вам нужна дополнительная помощь.
Лучшее,
Simone