Нет, ошибаетесь. Доступ только на чтение закрывает возможность менять поле отовсюду:
type A = class
fa: integer;
property a: integer read fa;
end;
begin
var a1 := new A;
a1.a := 2;
end.
Нет, ошибаетесь. Доступ только на чтение закрывает возможность менять поле отовсюду:
type A = class
fa: integer;
property a: integer read fa;
end;
begin
var a1 := new A;
a1.a := 2;
end.
Это касается обычных свойств. Но авто свойство - это обёртка для поля, которая выглядит как свойство, но работает как поле.
Не всегда у свойства должен быть дополнительный функционал. Часто может быть нужна лишь сама обёртка - свойство, причем создание поля явно было бы излишним, так как вызывает загромождение кода. В данной ситуации автосвойства являются полезными. Тем более, они позволят проще следовать стандартам .Net Framework.
Не закрывает:
type
A = class
fa: integer;
property a: integer read fa;
end;
begin
var a1 := new A;
a1.fa := 2; // Неправильно, но: private и protected члены видны отовсюду в пределах модуля, в котором определен класс. (Из справки)
end.
Требуется разграничение на секции с разным уровнем доступа. Поле - в секцию с уровнем доступа private/protected/internal (в крайнем случае, так как он предоставляет самый высокий уровень доступа из данных трех), свойство - с уровнем доступа public, то есть, к примеру, так:
type
A = class
private
fa: integer;
public
property a: integer read fa;
end;
begin
var a1 := new A;
end.
Новые ключевые слова в контексте введения автосвойств никогда не предлагались. read и write для этих целей предостаточно.
К слову, почему они до сих пор никак не выделяются в среде?
Думаю, что это ограничение должен указывать сам программист в геттере или сеттере автосвойства. Не вижу смысла в том, чтобы данное ограничение было по умолчанию и его никак нельзя было бы снять. Тем более, в C# автосвойства данным ограничением не обладают. Следует заметить, что именно из C# пришла идея сделать их и здесь.
Сделаем автосвойства сразу на чтение и запись. Ограничивать их использование и делать что то типа private set не будем
type
TName<T> = class
auto property X: T read; // readonly автосвойство
auto property Y: T write; // writeonly автосвойство
auto property Z: T read write; // автосвойство с доступом на чтение и запись
end;
begin
end.
, думаю этого будет предостаточно. Заранее спасибо.
Есть одна проблема. Автосвойство со способом доступа read Вы потом не инициализируете
Я не зря создавал эту Issue:
Инициализировать можно и сразу при объявлении. А вообще, зачем нужны автосвойства с доступом только на чтение? В этом случае, writeonly имеет гораздо больше смысла.
Чисто write-/readonly автосвойства не имеют особого смысла. Readonly можно инициализировать только при объявлении, а writeonly невозможно будет прочитать, т.е. вообще бред.
Ну у нас и обычные свойства не инициализируются. Это тянет за собой знаете ли - многое…
Так ведь default есть?
Да, согласен.
А зачем read автосвойства? Ума не приложу.
Моё предложение. Автосвойства - только readwrite. Иное запретить.
Я вот ума не приложу, зачем тут больше половины предложенного за последние месяцы. А Вы только первый раз… )))