Что такое Инкапсуляция? - C#
Формулировка задачи:
Приятной пятницы всем.
Начну с примера. Пусть есть у нас некий класс "A", одно из полей которого это List экземпляров другого класса "B". В классе "B" тоже одно из полей это List экземпляров ещё одного класса "C". Вот такая вот матрёшка, или точнее дерево. Подобная ситуация встречается сплошь и рядом.
Вот пример кода если со слов непонятно.
В экземплярах класса "C" уже содержатся конкретные данные которые пользователю хотелось бы получить. Собственно если все List'ы делать public то никаких особых проблем нет, и используются выражения типа
Но если List будет public, то мы автоматом получаем доступ ко всем внутренностям этой матрёшки и более того мы при желании можем не только считывать значения, но и удалять отдельные внутренние члены всей этой структуры (элемнты List'a). Вот не противоречит ли это дело "Инкапсуляции"?
В принципе можно сделать все листы private и написать для них Get-функции. Переписав класс A вот в таком виде.
Впринципе пользователь теперь может только брать данные, и ничего не сделат со внутренней структурой. Но стоит нам строение нашей матрешки сделать посложнее, чтобы было не одно интересное для чтения значение SomeValue в классе "C" а 10-15, да ещё и не только в классе "C" но и в "B" чёнить добавить, или ещё и классов добавить... То тогда класс в классе A надо будет писать кучу функций типа Get. Спрашивается, а стоит ли так всё усложнять?
При этом можно ли говорить об инкапсуляции в классах типа "B" и "C"? Если рассматривать инкапсуляцию как скрытие внутренностей от пользователя, которому дают только класс A то тут пожалуй всё хорошо. Но вот внтури то класса "A" нет даже намёка на инкапсуляцию классов "B" и "C". Конечно можно и для них сделать Get функции. Но тогда программа ещё сильнее раздуется на пустом месте. И снова спрашивается, а стоит ли так всё усложнять?
Впринципе в данном случае решением проблемы была бы возможность List'ам (как-то) выставить атрибут - "читать можно а изменять извне класса нельзя". Тогда можно обойтись и без Get-функций.
Но стоит только вспомнить о том, что пользователю вобщемто хотелось бы не только что-то счиывать из внутренностей этой матрешки, но и что-то туда записывать... Как в голове рождаются монструозные конструкции из гигансткого кол-ва Set-функций. И снова спрашивается - а до какой степени стоит заморачиваться об инкапсуляции?
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Encapsulation { class Program { static void Main(string[] args) { A a = new A(); Console.ReadKey(); } class A { public List<B> b; public A() { b = new List<B>(); b.Add(new B());//Добаим несколько элементов в b b.Add(new B()); b.Add(new B()); } } class B { public List<C> c; public B() { c = new List<C>(); c.Add(new C());//Добаим несколько элементов в c c.Add(new C()); c.Add(new C()); } } class C { public Int32 SomeValue; private static Int32 i; public C() { i++; SomeValue = i; } } } }
Int32 x= a.b[2].c[0].SomeValue;
class A { private List<B> b; public Int32 GetSomeValue(Int32 IndexB,Int32 IndexC) { return b[IndexB].c[IndexC].SomeValue; } public A() { b = new List<B>(); b.Add(new B());//Добаим несколько элементов в b b.Add(new B()); b.Add(new B()); } }
Решение задачи: «Что такое Инкапсуляция?»
textual
Листинг программы
public int X;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д