Софтуерно Инженерство
Loading...
antonio_rtodorov avatar antonio_rtodorov 74 Точки

Смисъла от употреба на "Private"?

Здравейте,

имам модификатор за достъп "Private", той се използва за да се капсулират данни, които не искаме да се достъпват от другите класове или създаваме get..(), който позволява да използването на private елемнтите в друг клас, който искам да ги виждам.

Примерите са ми следните, имам 20 класа правя си в един клас private Sting name; искам 18 класа с помоща на get..() да достъпят name, a eдин да клас да не може да го достъпи. Идва другия момент правя си public String name; в един клас и така той става достъпен за всичките 19 класа, обаче пиша съответния name като код в 18 класа, като в 19тия клас изобщо не го пиша като код. Въпроса ми е, защо тогава се счита, че като използваш  "Private" си защитаваш кода, като в двата случая, чрез код определяш кой клас да го достъпва?

 

Може да разледате и този пример http://www.progressivejava.net/2012/12/set-and-get-what-they-are-and-how-to-use-these-methods-correctly.html в който пак не ми става ясно защо трите елемента са private и ги достъпвам с get за да ги намнипулирам, защо просто не ги направя public пък аз ще определям кой клас да ги ползва.

Много ще съм ви благодарен за обяснение и примери!

Поздрави

Тагове:
0
C# OOP Basics 28/03/2016 13:18:25
Filkolev avatar Filkolev 4501 Точки

Нещо, което май не е споменато, но е доста важно - при добра абстракция публичните полета не вършат работа. Под добра абстракция имам предвид наличието на подходящи интерфейси и класова йерархия. 

Всичко, което трябва да може да се достъпва извън класа, трябва да е част от интерфейс, а в интерфейс не може да се слагат данни (полета), а само методи (вкл. пропъртита, индексатори и ивенти).

Да кажем, че си направил подобно приложение и имаш нещо подобно (най-базов скелет):

public interface IVehicle
{
    public int Kilometers { get; }    
}
public class Car : IVehicle
{
    public string model;

    private int kilometers;

    // constructor

    public int Kilometers => this.kilometers;
}

Ако работиш правилно, в приложението си би трябвало да ползваш IVehicle, което значи, че ще имаш достъп до километрите, но не и до модела на автомобила. За да може да го достъпиш, трябва да кастваш, което е много грозно и не много правилно:

IVehicle car = new Car();
string model = ((Car)car).model;

Ползвайки публични полета, а не гетъри, дефинирани в интерфейси, приложението ти ще е осакатено.

Затова, дори когато не правиш никакви валидации или обработки, правилният подход е да направиш автоматични пропъртита, а не публични полета.

 

1
g.stoyanov avatar g.stoyanov 775 Точки

Напълно те подкрепям колега,

това и аз се опитах да кажа. Примера е отличен, ако колегата има някакъв по-конкретен пример си мисля, че бихме му помогнали повече.

0