Функция - это изолированный фрагмент кода, которая решает некоторую задачу и предназначен для повторного использования.
Разрешения вызова метода определяется пользователем, с помощью его модификатора доступа: public - все имеют доступ, private- реализация (обращаются к именам только методы самого класса), protected - реализация и “наследники”, internal - все внутри сборки, protected internal
При динамической диспетчеризации метода разрешение вызова определяется во время выполнения, а не компиляции.