#c_sharp
Всем привет. Есть такой код: class a { protected a(string s) { this.s = s; } public string s; } class b : a { public b(string s) : base(s) { } public a RetObj() { return new a("jk"); //не работает } } Почему не создается объект в методе RetObj() ведь доступ к конструктору из класса b открыт для этого же класа. При этом выдается ошибка Ошибка 1 a не содержит конструктор, который принимает 1 аргументов Подскажите, что тут не так ?? Можно конечно сделать в этом методе return this; но хотелось бы понять почему нельзя создать объект класса а.
Ответы
Ответ 1
Это ограничение стандарта языка. В C# 1 то, о чём вы говорите, было возможно. В более новых версиях языка (начиная с C# 2) действует следующее правило: Вы можете обращаться к статическим защищённым полям, свойствам и методам из дочернего класса без ограничений. Вы можете обращаться к нестатическим защищённым полям, свойствам и методам из дочернего класса только через какой-то (любой) объект этого самого дочернего класса. Причём имеется в виду не динамический (runtime-), а статический (compile time) тип объекта. Конструктор причисляется к группе, покрываемой вторым случаем. Мотивация: Откуда взялось такое дополнительное требование для instance-методов? А вот откуда. Допустим, что такого требования не было бы. Тогда всю защиту, накладываемую protected, было бы очень легко обойти. Действительно, пусть у нас есть такой класс: class B { protected int X = 0; } Кто угодно мог бы обойти защиту и изменить X таким образом: class Attacker : B { static public void ModifyX(B b, int value) { b.X = value; } } (Этот приём известен как паттерн «Паблик Морозов».) Правило 2 запрещает такие трюки. С этим правилом, автор класса Attacker может «испортить» только объекты своего класса, но не чужой объект. Поскольку на защите через атрибуты контроля доступности наподобие private/protected базируется безопасность библиотеки .NET, подобный метод «обхода» защиты был бы серьёзной дырой. Фактически, подобные дыры были найдены в коде .NET framework, так что это ограничение их ликвидирует. Ответ основан на статье Many Questions: Protected Constructors из блогов MSDN.
Комментариев нет:
Отправить комментарий