Почему не все поля / свойства / методы общедоступны? - PullRequest
1 голос
/ 06 марта 2011

Я знаю, что это может звучать глупо, но я действительно хочу знать :) Я изучаю c # в настоящее время,

и, как вы знаете, вам нужно установить «объект» (кнопка, метка, текст, переменная и т. Д.).) публично или как угодно.

Однако вам все равно нужно написать код, подобный следующему:

// my point is you cant just type label1.text you need to type class.label1.text
// so there is no chance of getting bugged
//because there is label1 in each of forms/classes
 class Classlol = new class();
 classlol.label1.blabla

Так какой смысл делать его недоступным в других формах?почему каждая вещь не является публичной или не публичной по умолчанию?

Спасибо.

Ответы [ 4 ]

7 голосов
/ 06 марта 2011

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

Хотя я, вероятно, не должен был использоватьв последнем предложении есть слово internal, потому что есть третий вариант: модификатор доступа internal.Имя, используемое в VB.NET (Friend), возможно, более понятное.Это указывает на то, что часть данных должна быть видимой для всех других классов в пределах одной сборки, но скрыта снаружи.Аналогичная аналогия применима: есть вещи, которыми вы можете поделиться со своими ближайшими друзьями, но при этом не хотите быть публичными.

Есть и другие более сложные причины, такие как включение скрытия информации, чтобы максимизировать разделениемежду конкретным классом и остальной частью приложения, и для поддержания согласованного открытого интерфейса, даже если детали реализации могли быть изменены между версиями, которые способствуют хорошему объектно-ориентированному дизайну.Если вы действительно хотите понять все эти мелочи, я предлагаю вам найти хорошую книгу по объектно-ориентированному программированию.Очень трудно, если не невозможно, овладеть объектно-ориентированным языком, таким как C #, без четкого понимания основ.

Вещи не являются общедоступными по умолчанию, поскольку они могут содержать конфиденциальную информацию или, по крайней мере, информацию, котораяВы не хотите показывать как часть открытого интерфейса класса.Сделать что-то публичное - это более важное решение с большим риском, чем просто сделать это частным, поэтому вы вынуждены принять это решение явно .

6 голосов
/ 06 марта 2011

Смысл использования классов в том, чтобы иметь возможность разделить ваш код на логически связанные части. Это облегчает понимание и поддержку вашего кода.

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

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

3 голосов
/ 06 марта 2011

Предлагаю вам больше узнать об абстракции в объектно-ориентированном программировании.Может быть, Статья в Википедии об абстракции - хорошее место для начала.

РЕДАКТИРОВАТЬ: Абрад абсолютно прав, абстракция автоматически не подразумевает "скрытие" информации.Можно сказать, что это роль инкапсуляции в объектно-ориентированном программировании.

Полагаю, я хотел сказать, что этот вопрос не специфичен для C #, а скорее требует немногочтение общих принципов объектно-ориентированного программирования.

0 голосов
/ 06 марта 2011

Модификатор доступа по умолчанию - internal, что означает, что он является открытым внутри той же сборки и закрытым за пределами сборки.

Если вы хотите представить определенные данные как общедоступные, например текст какой-либо метки, рекомендуется создать общедоступное свойство только для чтения, например:

public string LabelText
{
   get { return MyLabel.Text; }
}

Для доступа к нему вам понадобится такой код:

string text = classInstance.LabelText;

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

...