Форум за съобщения и дискусии по лекционните теми

Теми за онлайн дискусии към модул 1

Теми за онлайн дискусии към модул 1

от Боян Бончев -
Number of replies: 2

Здравейте колеги,


Първата лекция от курса "Софтуерни шаблони за проектиране" вече е публикувана в сайта на курса. Можете да я изтеглите и да я прегледате. По нея ви предлагам следните теми за онлайн дискусия в този форум:

1. Защо полиморфни извиквания на методи са възможни само за методите на екземпляра, но не и на класа?

2. В кои програмни езици можем да предефинираме (чрез overriding) статични методи на класа и в кои - не? Как си го обяснявате?

3. Кой от трите начина за многократно използване на класове (слайд 23) предпочитате, и кога? 

4. Защо конструкторите на класа не могат да се наследяват?


Поздрави,

Боян

In reply to Боян Бончев

Re: Теми за онлайн дискусии към модул 1

от Захари Тасков -

Здравейте,

Прилагам някой отговори на поствените въпроси:

1.Защото такъв вид методи се избират по време на изпълнение в зависимост от типа на обекта.Полиморфизмът изисква екземпляр,защото  позволява методът да бъде избран динамично в зависимост от екземпляра на класа.Затова полиморфизмът не позволява извикване на методите на класа.Ако бъде извикан метод на класа над екземпляр,реализацията на метода на класа се избира не в/у класа на екземпляра по време на run-time,а в/у типа на рефериращия екземпляр по време на compile-time.
2. Езици,които могат да предефинират статични методи:Ruby,Smalltalk Езици,които могат да предефинират статични методи:Java
Въпреки,че не е възможен override на статичен метод в Java ,е възможно написването на следния код:

class Muj {
    public static void method() {
        System.out.println("E muj sym");
    }
}

class Lecturer extends Muj {
    public static void method() {
        System.out.println("Mnogo jeni zapisali kursa,a puk samo muje na lekciqta?");
    }
}
Това прилича на override,но всъщност е скриване на статичен метод в друг статичен метод и е валиден компилационен код.Но това не е полиморфизъм.С други думи статичните методи не могат да бъдат override-нати,защото те никога не се викат полиморфично.
3.Предпочитам варианта с делегирането.Ако към разработваната системата нефункционалното изискване за изменяемост не е отбелязано като важно е по-добре да се използва делегиране,тъй като дава възможност за преизползване на код и имитиране на множествено наследяване.Но дори да е отбелязано като важно изискването за изменяемост пак е възможно да се приложи делегиране в малко извратен вариант.Например чрез прилагане на следните тактики за изменяемост:създаване на API,използване на посредник и др.Варианта с параметризацията е вдлъбващ-не е лош,но за по-малки системи(с-мата става трудна за поддържане).
4.Конструкторите не са членове на класа.Само членове на класа могат да бъдат наследявани.Това означава,че не е възможно създаването на екземпляр от подклас чрез използването на конструктор на някой от суперкласовете.Също така ако конструкторите
се наследяваха,то няма как един клас да стане private.

Поздрави с много мощ,

Захари


In reply to Боян Бончев

Re: Теми за онлайн дискусии към модул 1

от Георги Пасков -

Здравейте,

Съгласен съм с колегата.


Мога да допълня към въпрос 3:  

- Генерализиране се използва, когато има два или повече подобни класа с еднаквo поведение и характеристики.

Тогава има смисъл да изведем тези общи характеристики в един суперклас.

Това намалява преизползването на код.

- Използваме делегиране (composition), когато имаме връзката/релацията "has-a".

Новият клас е съставен и използва методи от съществуващия клас.

Чрез делегирането на операции се запазва енкапсулацията между класовете.

Така всеки клас има само една конкретна задача и остава по-малък.

Намалява се coupling-а(зависимостта) между класовете.

Използването на интерфейси е важна част от делегирането.

- Използваме наследяване, когато имаме връзката "is-a".

Позволява на подкласа да наследи поведението и характеристиките от суперкласа.

Подкласът може да override-не методи или да добави нови.

При промяна на суперкласа обаче се променя работата на подкласа.

Наследяването и делегирането са взаимно-заменяеми.

Второто обаче запазва енкапсулацията.

При делегирането имаме повече гъвкавост и промените в кода обикновено са по-малки.

Към 4: 

-  Целта на конструкторите е създаване на инстанция от определен тип.

Те носят името на класа.

Ако конструкторите се наследяваха това щеше да развали концепцията на полиморфизма.

Не може референция на обект от подклас да сочи към инстанция на обект от суперклас. 

Подкласът обикновено надгражда функциите на класа родител.


Поздрави,

Георги