Это не тривиально обсуждать это на таком общем уровне.Я постараюсь.
Обычно фреймворк предоставляет набор абстрактных классов, которые используются в коде фреймворка, но привязка которых разрешается только во время выполнения.
Фреймворк вызывает методы экземпляров этих классов, которые вы несете ответственность за реализацию в вашем коде.
То есть в вашем коде вы будете расширять такие классы и "заполнять пробелы"".
Склейка между вашим кодом и кодом фреймворка - это контракт, определенный такими абстрактными классами (или интерфейсами, fwiw): фреймворк знает, что данный метод принимает параметры типа K и возвращает тип T,таким образом, можно безопасно вызывать его, предполагая, что его семантика будет соблюдаться разработчиком.
С другой стороны, когда вы реализуете метод, вы неявно соглашаетесь с приложенным к нему контрактом и реализуете его с учетом семантики, связанной с ним.
Надеюсь, он достаточно ясен.