Въпрос относно Encaptulation C#


0

Здравейте!

Имам следния клас:

Имам и следния друг клас който го наследява:

public class InteractionManager { public void HandleInteraction() { this.HandleCreationCommand(); } private void HandleCreationCommand() { Console.WriteLine("Hello!"); } }

public class ExtendedInteractionManager : InteractionManager { }

В Main метода правя следното:

static void Main(string[] args) { ExtendedInteractionManager extendedInteractionManager = new ExtendedInteractionManager(); extendedInteractionManager.HandleInteraction(); }

Програмата се компилира и ми изписва на конзолата "Hello". Което е странно за мен защото метода HandleCreationCommand е private и runtime не би ли следвало ключовата дума this да бъде заменена със създадената инстанция на ExtendedInteractionManager и компилатора да ми даде грешка: Не може да се достъпи метода due to its protection level.




Отговори



0
Ти викаш HandleInteraction, който се изпълнява от базовия клас, а той има достъп до private методите.

от neutrino (3376 точки)


0
Но ключовата дума this , runtime се замества с extendedInteractionManager нали?

от montolivo (26 точки)

0

Защо мислиш така?

This (в превод "туй" :) ) означава "метода на този клас" в случая. Или по-точно на "инстанцията на тоя клас, в който съм".

В случая this означава "структурата, която е създадена въз основата на дефиницията на класа InteractionManager" и се изпълнява съвсем коректно.

Може би е малко объркващо, но ако пробваш ще видиш че ще работи и без this. Тогава какво ще означава?

За да ти е по-ясно, вместо метод, можеш да пробваш с променлива и тогава ще е малко по-ясно. Ако имаш променлива variable в 2 инстанции на класа InteractionManager, то this.variable ще означава отделна стойност във всяко едно от копията на класа (отново и без 'this' ще е същото).

Малко е объркващо, и когато се ползва в такива елементарни примери е по-скоро пречка, а не спомага за четимостта на кода. Но примерно в конструктор:

private someString

public Constructor (sting someString)

{

   someString = someString;

}

е доста стресиращо, макар че компилатора се оправя :) В тоя случай

   this.someString = someString;

е една идея по-четимо.


от JulianG (5316 точки)


0

 Разгледай проблема така:

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

Чрез публичните методи можеш индиректно да викаш прайвът методите на класа.


от ivan.mihov1 (4988 точки)


0
Може да го погледнеш и от друга гледна точка. Понякога не се разбира, защо в крайна сметка съществуват тези private методи. Наследяването се прави за да не се повтаря код (макар че има и други решения за това в другите езици, дори не е нужно да имаш класове). Скритите (private) методи те освобождават от необходимостта да мислиш за твърде много неща, може да приемеш, че някой друг е написал класа и ти работиш само с публичния му интерфейс, въобще не те интерсува, кое как е имплементирано. В твоя случай, имаше един клас InteractionManager, за който знаеш, че има метод HandleInteraction. Очевидно ти трябва този метод, но искаш да добавиш още свои метод, наследяваш го и продължаваш да си ползваш метода без дори да знаеш как е имплементиран и какви частни методи вика вътрешно. Ти викаш публичен метод, от там нататък той трябва да направи, това което се очаква от него.

от neutrino (3376 точки)