2016-10-27 3 views
5

Почему эта компиляция?Почему я разрешаю доступ к методу менее ограничительный, чем доступ к классу?

internal class A { 

    public func f() { 

    } 
} 

Я ожидал, что модификатор «public» f будет запрещен, поскольку его охватывающий класс является внутренним.

+1

Я согласен, что это должна быть ошибка. Как ни странно, это не распространяется на книгу Apple «Swift Programming Language» под уровнями доступа. – rmaddy

+0

@rmaddy Что вы думаете о моем ответе? –

+2

Я думаю, что цитата в вашем ответе относится к совершенно другой вещи, чем код в вашем вопросе. Например, публичная функция не может вернуть значение с помощью частного типа. – rmaddy

ответ

0

Свифт ссылка говорит под руководящим принципом уровней доступа,

Ни один субъекта может быть определен в терминах другого объекта, имеющим более низкий (более ограничительного) уровень доступа.

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

6

Одной из причин для разрешения этого упоминаются в SE-0025: Scoped Access Level (курсив):

Компилятор не должен предупредить, когда более широкий уровень контроля доступа используется в пределах типа с более ограничительным доступом, такими как internal в пределах a private тип. Это позволяет владельцу типа проектировать доступ, который они будут использовать, чтобы они стали более доступными. (члены до сих пор не могут быть доступны за пределами ограждающих лексической области, потому что сам по себе тип по-прежнему ограничено, т.е. вне кода никогда не будет сталкиваться значение этого типа.)

Таким образом, хотя это не изменяет доступность членов, он позволяет разработчикам сообщать уровень доступа, который, по их мнению, должен иметь данный член, если охватывающий тип имеет более широкий уровень доступа, который может, например, быть полезен для API, которые в настоящее время имеют типы internal, которые планируется сделать public в будущий выпуск.

+0

Ключевое слово «warn». Даже если бы он предупредил, я предполагаю, что он все равно будет компилироваться. –

+0

@IanWarburton Конечно, но мотивация для разрешения такого поведения одинакова независимо от того, считаете ли вы, что это должна быть ошибка или предупреждение. Я не вижу причин, по которым он * не должен компилироваться, потому что он не влияет на доступность этого элемента, поскольку он все еще ограничен уровнем доступа охватывающей области. Поэтому, поскольку нет изменений в поведении, если оно не предназначено, предупреждение будет более подходящим, чем ошибка IMO компилятора. – Hamish

+0

Вопрос в том, почему код компилируется, а не почему он не генерирует предупреждение. –

Смежные вопросы