Что такое Инкапсуляция? - C#

Узнай цену своей работы

Формулировка задачи:

Приятной пятницы всем. Начну с примера. Пусть есть у нас некий класс "A", одно из полей которого это List экземпляров другого класса "B". В классе "B" тоже одно из полей это List экземпляров ещё одного класса "C". Вот такая вот матрёшка, или точнее дерево. Подобная ситуация встречается сплошь и рядом. Вот пример кода если со слов непонятно.
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace Encapsulation
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. A a = new A();
  12. Console.ReadKey();
  13. }
  14. class A
  15. {
  16. public List<B> b;
  17. public A()
  18. {
  19. b = new List<B>();
  20. b.Add(new B());//Добаим несколько элементов в b
  21. b.Add(new B());
  22. b.Add(new B());
  23. }
  24. }
  25. class B
  26. {
  27. public List<C> c;
  28. public B()
  29. {
  30. c = new List<C>();
  31. c.Add(new C());//Добаим несколько элементов в c
  32. c.Add(new C());
  33. c.Add(new C());
  34. }
  35. }
  36. class C
  37. {
  38. public Int32 SomeValue;
  39. private static Int32 i;
  40. public C()
  41. {
  42. i++;
  43. SomeValue = i;
  44. }
  45. }
  46. }
  47. }
В экземплярах класса "C" уже содержатся конкретные данные которые пользователю хотелось бы получить. Собственно если все List'ы делать public то никаких особых проблем нет, и используются выражения типа
Листинг программы
  1. Int32 x= a.b[2].c[0].SomeValue;
Но если List будет public, то мы автоматом получаем доступ ко всем внутренностям этой матрёшки и более того мы при желании можем не только считывать значения, но и удалять отдельные внутренние члены всей этой структуры (элемнты List'a). Вот не противоречит ли это дело "Инкапсуляции"? В принципе можно сделать все листы private и написать для них Get-функции. Переписав класс A вот в таком виде.
Листинг программы
  1. class A
  2. {
  3. private List<B> b;
  4. public Int32 GetSomeValue(Int32 IndexB,Int32 IndexC)
  5. {
  6. return b[IndexB].c[IndexC].SomeValue;
  7. }
  8. public A()
  9. {
  10. b = new List<B>();
  11. b.Add(new B());//Добаим несколько элементов в b
  12. b.Add(new B());
  13. b.Add(new B());
  14. }
  15. }
Впринципе пользователь теперь может только брать данные, и ничего не сделат со внутренней структурой. Но стоит нам строение нашей матрешки сделать посложнее, чтобы было не одно интересное для чтения значение SomeValue в классе "C" а 10-15, да ещё и не только в классе "C" но и в "B" чёнить добавить, или ещё и классов добавить... То тогда класс в классе A надо будет писать кучу функций типа Get. Спрашивается, а стоит ли так всё усложнять? При этом можно ли говорить об инкапсуляции в классах типа "B" и "C"? Если рассматривать инкапсуляцию как скрытие внутренностей от пользователя, которому дают только класс A то тут пожалуй всё хорошо. Но вот внтури то класса "A" нет даже намёка на инкапсуляцию классов "B" и "C". Конечно можно и для них сделать Get функции. Но тогда программа ещё сильнее раздуется на пустом месте. И снова спрашивается, а стоит ли так всё усложнять? Впринципе в данном случае решением проблемы была бы возможность List'ам (как-то) выставить атрибут - "читать можно а изменять извне класса нельзя". Тогда можно обойтись и без Get-функций. Но стоит только вспомнить о том, что пользователю вобщемто хотелось бы не только что-то счиывать из внутренностей этой матрешки, но и что-то туда записывать... Как в голове рождаются монструозные конструкции из гигансткого кол-ва Set-функций. И снова спрашивается - а до какой степени стоит заморачиваться об инкапсуляции?

Решение задачи: «Что такое Инкапсуляция?»

textual
Листинг программы
  1. public int X;

ИИ поможет Вам:


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

Оцени полезность:

5   голосов , оценка 4.4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут