2013-04-30 4 views
0

Элементы данных класса C# (поля или свойства) могут быть частными или общедоступными или защищены.Доступ к классам C#

Что делать, если я хочу, чтобы частное поле для методов членов использовалось только и не отображалось во внешнем мире?

Я могу продолжать использовать личное поле, не нарушая инкапсуляции или что-то в этом роде?

То, что я не понимая это два понятия: данные, которые мы, возможно, придется подвергать внешнему миру против данных мы не можем нужно сделать так (на периферии класса) ..

Каковы эти два типа данных, говоря о построении класса?

В приведенном ниже примере частное поле «имя» является приватным для класса, но по-прежнему получает/настраивает внешний/внешний мир. Является ли абстракция здесь, чтобы «прямо не выставлять напоказ, как здесь, вы идете на нее», а добавить косвенный механизм доступа или обновления? Это инкапсуляция, о которой мы говорим здесь, когда говорим о публичных полях и публичных свойствах?

class Employee2 
{ 
    private string name = "Harry Potter"; 
    private double salary = 100.0; 

    public string GetName() 
    { 
     return name; 
    } 

    public void SetName(string title, string fullName) 
    { 
     this.name = title + fullName;   
    } 

    public double Salary 
    { 
     get { return salary; } 
    } 
} 

class PrivateTest 
{ 
    static void Main() 
    { 
     Employee2 e = new Employee2(); 

     // The data members are inaccessible (private), so 
     // they can't be accessed like this: 
     // string n = e.name; 
     // double s = e.salary; 

     // 'name' is indirectly accessed via method: 
     string n = e.GetName(); 

     // 'salary' is indirectly accessed via property 
     double s = e.Salary; 
    } 
} 
+3

методы Почему вы используете, а не собственность для 'Name', и почему ваш сеттер ничего не установил? Это очень странный образец. –

+0

Спасибо, Джон за вопрос. Я на самом деле схватил пример отсюда: http://msdn.microsoft.com/en-us/library/st6sy9xe.aspx – Athapali

+0

Я предлагаю вам прочитать инкапсуляцию в Википедии [link] (http://en.wikipedia.org/wiki/Encapsulation_ (object-oriented_programming)) – Tombala

ответ

0

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

редактировать:

SetName(), как упоминалось в комментариях, является нечетным дополнением. Он должен фактически изменить имя (и принять параметр), а не возвращать строку.

3

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

class Employee2 
{ 
    private string name = "Harry Potter"; 
    private double salary = 100.0; 

    protected string GetName() 
    { 
     return name; 
    } 

    protected string SetName(string newName) 
    { 
     this.name = newName; 
    } 

    protected double Salary 
    { 
     get { return salary; } 

    } 
} 
0

инкапсуляция означает, что внутреннее представление объекта, как правило, скрыты от глаз за пределами определения объекта. Как правило, собственные методы только объект могут непосредственно проверять или манипулировать его поле

 private decimal accountBalance = 500.00m; 

     public decimal CheckBalance() 
      { 
      return accountBalance; 
      } 

и где получить и набор полезны для запуска события по изменению значений элементов объекта

Смежные вопросы