2010-04-17 3 views
4

Если мы определим свойство как public и в этом объявлении имеем protected геттер. что это значит? если свойство является общедоступным, что означает определение защищенного геттера для этого, значит? смотрите ниже код:Что это значит? [C#]

public ISessionFactory SessionFactory 
    { 
     protected get { return sessionFactory; } 
     set { sessionFactory = value; } 
    } 
+5

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

+0

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

+0

@macke, в этом случае я бы предпочел метод Set или Initialize, поскольку семантика свойства подразумевает наблюдаемость. Если я могу установить значение Instance.X =, я ожидаю, что сразу после этого вы сможете Assert (значение Instance.X ==) (если не было исключения, выполняющего набор). –

ответ

2

В C# вам разрешено иметь getters and setters с уровнями доступа (см. access modifiers), отличное от общей собственности. Это наиболее распространенный вид

public class FooObject 
{ 
    public String Foo 
    { 
     get; 
     private set; 
    } 
} 

Это позволяет объектам инстанцировании FooObject, чтобы получить значение Foo, но не установить это значение. Частный модификатор на сеттер означает, что только FooObject сам обладает этой способностью (не считая использования отражения).

Есть два преимущества этого:

  1. С добавлением автоматических свойств (переменные не нужно назначать получить и установить значение), это позволяет частному значения переменной собственности (он создан для вас во время компиляции), чтобы это было сделано без необходимости явно создавать переменную. Без этого вы не могли бы использовать автоматическое свойство, если только вы не хотели, чтобы функция get и set была общедоступной, все частные и т. Д.

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

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

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

11

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

0

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

http://msdn.microsoft.com/en-us/library/bcd5672a(VS.71).aspx

0

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