Кога abstract class и кога Interface?
Здравейте!
Имам трудности отностно разбирането кога да използвам абстрактен клас и кога интерфейс. Докато проверявах домашните(последните) на колеги видях, че някои са използвали интерфейси, а други абстрактни класове за едно и също. По дефиниция, до колкото разбрах, интерфейсите са договор, който показва, че дадения клас който наследява интерфейса е задължен да има съответната функционалност. От друга страна в домашната за наследяване и абстракция, в 3та задача имаме част от следното условие:
Extract interfaces for each class. (e.g. IPerson, IEmployee, IManager, etc.) The interfaces should hold their public properties and methods (e.g. IPerson should hold id, first name and last name). Each class should implement its respective interface.
Защо тук се изисква да сложим тези неща в интерфейс като може да ги бутнем в съответния клас или е сложено заради упражнение или правилно ли е винаги да вадим базова функционалност дори и от абстрактен клас в интерфейс?
Благодаря!
Ясно, благодаря за силния отговор! Но в такъв случай да разбирам ли, че по начина, по който имахме да правим задачата която съм описал по горе (интерфейс IPerson за клас Person и т.н.), е правилния начин за работа с интерфейси , макар и в случая да можеше да се направи и без тях?
Да, интерфейсите са инструмент за повишаване на абстракцията и правят приложението по-качествено от много гледни точки - разкаченост (класовете да зависят минимално от други класове), тестваемост, гъвкавост и др.
Когато в някой клас, да речем Manager, имаш списък от служители, които той ръководи, списъкът е правилно да е някаква колекция от IEmployee. Благодарение на полиморфизма това ще ти позволи в този списък да сложиш всякакви служители, дори такива, за които не подозираш, че в даден момент може да съществуват - примерно някой е взел кода ти и е решил, че му трябва някакъв вид служител, който има поведение на IEmployee, но пък не е точно Employee по начина, по който ти си го описал. Той си прави нов клас служители, които имплементират интерфейса, но не и твоя абстрактен клас или някой от наследниците му. Но приложението все още ще работи коректно, понеже няма проблем да имаш мениджъри, които ръководят новия тип служители - те не се интересуват от конкретния клас на служителите си, а само от това дали на абстрактно ниво те са някакъв вид служители (което значи да имплементират интерфейса директно или индиректно).
Разбирам, благодаря ти за изчерпателния отговор!