Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

Почему нет доступа к конструктору

#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.

Комментариев нет:

Отправить комментарий