Атрибуты: обозначение доступа

#c# #oop #private #public #private-members

#c# #ооп #Частное #общедоступный #частные участники

Вопрос:

Когда я ссылался на книгу , я получил следующие утверждения:

Когда тип данных или метод определены как общедоступные , другие объекты могут напрямую обращаться к ним. Когда тип данных или метод определены как частные, только конкретный объект может получить к ним доступ.

Теперь это действительно сбивает с толку. Public и Private — это спецификаторы доступа, которые определяют только область действия атрибута или метода.

Почему объект смешивается со спецификаторами доступа? Должен ли объект делать что-либо с общедоступным, частным или защищенным, кроме того факта, что если какая-то вещь определена как общедоступная, то объекты тоже смогут получить доступ к irespective из области

Ответ №1:

Это не вопрос области видимости, а модификатор ограничения доступа. Если вы объявляете функцию как закрытую, это означает, что только этот класс может вызывать эту функцию.

Public: любой может вызывать эти функции Private: Только этот класс и механизм отражения Protected: только этот класс и его производный член Internal: Общедоступный для всех классов в этой сборке

Небольшой пример

 public class A
{
    public int x;
    protected int y;
    private int z;
}

public class B : A
{
    public int CallPro()
    {
        return y;
    }

    public int CallPriv()
    {
        return z; //error 
    }

}

static void Main()
{
    A oa;
    oa.x; //Fine
    oa.y; //Error
    oa.z; //Error


}
 

Ответ №2:

Public и Private — это спецификаторы доступа, которые определяют только область действия атрибута или метода.

И это определяет поведение объекта. Следовательно, спецификаторы доступа важны для объекта. Представьте, что если у вас есть объект типа фасада, вы не хотите раскрывать все детали операции, скорее вы хотите, чтобы простой общедоступный интерфейс (например, метод Save() ) был доступен для потребителей. Вот почему вы должны учитывать спецификаторы для объектов.

 public class CustomerFacade()
{
public bool Save(Customer c)
{
    VerifyCustomer(c);
// lots of other steps which the caller does not need to know
    SaveorUpdateCustomer(c);
    }
    private void VerifyCustomer(Customer c)
    {
    }
    private void SaveorUpdateCustomer(Customer c)
    {
    }
    }

public class CustomerController()
{
public bool Save(Customer c)
{
return new CustomerFacade().Save(c);
}
}
 

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

1. Спасибо. Будет понятнее, если у вас есть фрагмент кода для того же самого