Чем отличается public от private

Чем отличается public от private

567 MrM [2009-03-05 16:48:00]

Все мои годы в колледже я использовал public и хотел бы знать разницу между public , private и protected ?

И что делает static в отличие от ничего?

access-modifiers c# .net asp.net

12 ответов

817 Решение mbillard [2009-03-05 16:55:00]

Модификаторы доступа

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

частный

Доступ к типу или члену может получить только код в том же классе или структуре.

защищенный

Доступ к типу или члену может получить только код в том же классе или структуре или в производном классе.

внутренний

Доступ к типу или члену может получить любой код в той же сборке, но не с другой сборки.

защищенный внутренний

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

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

Static

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

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

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

Статические классы часто используются как службы, вы можете использовать их так:

Публичная. Если вы можете увидеть класс, вы можете увидеть метод

Частный. Если вы являетесь частью класса, вы можете увидеть этот метод, в противном случае нет.

Защищенный — тот же, что и Private, плюс все потомки также могут видеть этот метод.

Статический (класс). Помните о различии между "Классом" и "Объектом"? Забудьте все это. Они одинаковы с "статическими". класс является единственным и единственным экземпляром самого себя.

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

Графический обзор (резюме в двух словах)

Для параметров по умолчанию, если вы не добавили модификатор доступа спереди, см. здесь:
По умолчанию видимость для классов и членов С# (поля, методы и т.д.)?

20 leppie [2009-03-05 20:27:00]

Относительно вопроса Ничего

  • Типы пространства имен по умолчанию являются внутренними.
  • Любой член типа, включая вложенные типы, по умолчанию является закрытым.

10 CraigTP [2009-03-05 16:53:00]

Public предоставляет метод или тип полной видимости из других типов/классов.

Читайте также:  Синус угла в квадрате

Частный разрешает только тип, содержащий приватный метод/переменную, доступ к частному методу/переменной (обратите внимание, что вложенные классы также имеют доступ к содержащимся классам private methods/variables).

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

"Nothing" — эквивалент VB.NET, равный null. Хотя, если вы имеете в виду "ничего", что означает "нет модификатора доступа", это зависит от него, хотя очень грубое эмпирическое правило (конечно, на С#) заключается в том, что если вы явно не указали модификатор доступа, метод/переменная объявление обычно ограничено, как может быть. т.е.

фактически совпадает с:

Связанная статья MSDN предложит полное описание, если явно не указан модификатор доступа.

8 Tony [2009-03-05 16:55:00]

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

Ничто не похоже на нуль, но на VB.
Static означает, что у вас есть один экземпляр этого объекта, метод для каждого экземпляра этого класса.

4 gbianchi [2009-03-05 16:53:00]

Static означает, что вы можете получить доступ к этой функции, не имея экземпляра класса.

Вы можете получить доступ непосредственно из определения класса.

Статус Private указывает, что доступ к переменным может быть доступен только объектам одного класса. Защищенный статус расширяет этот доступ для включения потомков этого класса.

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

Эти модификаторы доступа указывают, где ваши члены видны. Вы, наверное, должны это прочитать. Возьмите ссылку, данную IainMH в качестве отправной точки.

Статические элементы — один для каждого класса, а не один для каждого экземпляра.

Тщательно следите за доступностью ваших занятий. Публичные и защищенные классы и методы по умолчанию доступны для всех.

Также Microsoft не очень разбирается в показе модификаторов доступа (общедоступных, защищенных и т.д.), когда создаются новые классы в Visual Studio. Итак, заботитесь и думайте о своей доступности вашего класса, потому что это дверь к вашим внутренним реалиям.

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

Наследование

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

Класс, который получается в результате наследования от другого, называется подклассом. Эту связь обычно описывают с помощью терминов «родительский» и «дочерний». Дочерний класс происходит от родительского и наследует его характеристики: свойства и методы. Обычно в подклассе к функциональности родительского класса (который также называют суперклассом) добавляются новые функциональные возможности.

Чтобы создать подкласс, необходимо использовать в объявлении класса ключевое слово extends , и после него указать имя класса, от которого выполняется наследование:

Подкласс наследует доступ ко всем методам и свойствам родительского класса, так как они имеют тип public . Это означает, что для экземпляров класса my_Cat мы можем вызывать метод add_age() и обращаться к свойству $age не смотря на то, что они определены в классе cat . Также в приведенном примере подкласс не имеет своего конструктора. Если в подклассе не объявлен свой конструктор, то при создании экземпляров подкласса будет автоматически вызываться конструктор суперкласса.

Читайте также:  Как делать презентацию в майкрософт ворд

Обратите внимание на то, что в подклассах могут переопределяться свойства и методы. Определяя подкласс, мы гарантируем, что его экземпляр определяется характеристиками сначала дочернего, а затем родительского класса. Чтобы лучше это понять рассмотрим пример:

При вызове $kitty->foo() интерпретатор PHP не может найти такой метод в классе my_Cat , поэтому используется реализация этого метода заданная в классе Cat . Однако в подклассе определено собственное свойство $age , поэтому при обращении к нему в методе $kitty->foo() , интерпретатор PHP находит это свойство в классе my_Cat и использует его.

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

Мы можем обращаться с экземпляром класса my_Cat так, как будто это объект типа Cat , т.е. мы можем передать объект типа my_Cat методу foo() класса Cat , и все будет работать, как надо.

Оператор parent

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

Чтобы вызвать нужный метод из родительского класса, вам понадобится обратиться к самому этому классу через дескриптор. Для этой цели в PHP предусмотрено ключевое слово parent . Оператор parent позволяет подклассам обращаться к методам (и конструкторам) родительского класса и дополнять их существующую функциональность. Чтобы обратиться к методу в контексте класса, используются символы " :: " (два двоеточия). Синтаксис оператора parent :

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

Когда в дочернем классе определяется свой конструктор, PHP не вызывает конструктор родительского класса автоматически. Это необходимо сделать вручную в конструкторе подкласса. Подкласс сначала в своем конструкторе вызывает конструктор своего родительского класса, передавая нужные аргументы для инициализации, исполняет его, а затем выполняется код, который реализует дополнительную функциональность, в данном случае инициализирует свойство подкласса.

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

Здесь сначала вызывается метод getstr() из суперкласса, значение которого присваивается переменной, а после этого выполняется остальной код определенный в методе подкласса.

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

public, protected и private: управление доступом

До этого момента мы явно объявляли все свойства как public (общедоступные). И такой тип доступа задан по умолчанию для всех методов.

Читайте также:  Лучшие смартфоны без камеры

Элементы класса можно объявлять как public (общедоступные), protected (защищенные) и private (закрытые). Рассмотрим разницу между ними:

  • К public (общедоступным) свойствам и методам, можно получить доступ из любого контекста.
  • К protected (защищенным) свойствам и методам можно получить доступ либо из содержащего их класса, либо из его подкласса. Никакому внешнему коду доступ к ним не предоставляется.
  • Вы можете сделать данные класса недоступными для вызывающей программы с помощью ключевого слова private (закрытые). К таким свойствам и методам можно получить доступ только из того класса, в котором они объявлены. Даже подклассы данного класса не имеют доступа к таким данным.

public — открытый доступ:

private — доступ только из методов класса:

protected — защищенный доступ:

Модификатор protected с точки зрения вызывающей программы выглядит точно так же, как и private : он запрещает доступ к данным объекта извне. Однако в отличие от private он позволяет обращаться к данным не только из методов своего класса, но также и из методов подкласса.

Пишешь на С++? Читай этот блог.

Вокруг public, private и protected

Тема довольно избита, однако, я всё-таки решил начать с неё. Думаю, новичкам будет полезно.

Итак, public, private и protected — это модификаторы доступа, а не видимости, как ошибочно думают некоторые. Private члены видны снаружи класса, но не доступны.

Теперь кратко, кому какой доступ они предоставляют.

  • Public — доступ открыт всем, кто видит определение данного класса.
  • Private — доступ открыт самому классу (т.е. функциям-членам данного класса) и друзьям (friend) данного класса, как функциям, так и классам.
  • Protected — доступ открыт классам, производным от данного.

Далее приведены примеры доступа с указанием какие поля в каких местах программы доступны.

В C++ существует public-наследование, private-наследование и protected-наследование. В зависимости от того, какой тип используется, изменяется доступ к членам базового класса для клиентов производного. В таблице сведена информация об этом изменении.

Исходный модификатор доступа
public private protected
public-наследование public private protected
private-наследование private private private
protected-наследование protected private protected

Следует добавить, что производный класс может изменить модификатор доступа с protected на public, разместив using объявление в соответствующей секции класса:

Напоследок приведу несколько приёмов, с помощью которых можно «достучаться» до закрытых функций или данных. Допустим, у нас есть класс some и нам нужно обнулить закрытую переменную c:

  • Модифицировать определение класса, добавив друга (функцию или класс)
  • Воспользоваться препроцессором:
  • Создать класс с таким же расположением в памяти и воспользоваться reinterpret_cast для преобразования указателей:

Если у «взламываемого» класса есть шаблонная функция, можно её специализировать своим типом:

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

UPD (31.08.2013): Для компиляторов GCC и CLANG существует опция -fno-access-control, которая позволяет отключить контроль доступа к членам класса со стороны компилятора.

UPD (31.08.2013): Переформатировал исходный код под использование встроенного плагина вордпресса.

Ссылка на основную публикацию
Adblock detector