PDA

Просмотр полной версии : Повторение функциональности


sospamom
19.09.2013, 17:07
От класса Motion наследуются классы Linear и Circular. В Linear и Circular никакие функции Motiona не переопределяются.
От класса Linear наследуются 4 класса, которые переопределяют только те функции, которые были в Motion.
Теперь от класса Circular я хочу наследовать 4 класса, которые один в один как вышеупомянутые 4 класса, но только наследуются от Circular.
Мне не нравится, что я ту же функциональность описываю по второму разу. Как красиво решить эту проблему?

AlexCooper
19.09.2013, 17:11
Создать "супер"-класс где будут описаны Ваши методы и наследовать Linear и Circular от этого класса. То-есть по сути в Motion создать Ваши protection методы.

Akopalipsis
19.09.2013, 17:34
Хотел в будущем создать тему, но раз уж подняли тему о наследовании.
Когда я смотрел как устроен BulkLoader я впервые увидел вот какой подход -
есть супер класс в котором прописаны все слушатели и обработчики. И остальные классы ( загрузка битмапов, звука и т.д. ) наследуются от этого супер класса, но они не чего не решают. Они по событиям уведомляют супер класс, который уже решает, что с чем делать. То есть он как контроллер. И мне интересно - это нормальный подход, вот так вот делать?

sospamom
19.09.2013, 17:39
Сорри. Забыл упомянуть.
4 класса по-разному переопределяют одни и те же методы класса Motion.

AlexCooper
19.09.2013, 17:40
Конечно нормальный, только он не решает, а просто выполняет свои прямые "обязанности". Зачем плодить сущность для каждого из загрузчика если механизм загрузки один и тотже, разница только в способе интерпретации полученных данных.

Добавлено через 55 секунд
Сорри. Забыл упомянуть.
4 класса по-разному переопределяют одни и те же методы класса Motion.

можете показать код, как-то сегодня гадание на кофейной гуще не идет.

Akopalipsis
19.09.2013, 17:45
а просто выполняет свои прямые "обязанности".
То есть он являясь супер классом, является ещё и менеджером?
Ведь когда одна загрузка завершилась, он говорит, что нужно грузить следующую ссылку..

Babylon
19.09.2013, 17:48
Хотел в будущем создать тему, но раз уж подняли тему о наследовании.
Когда я смотрел как устроен BulkLoader я впервые увидел вот какой подход -
есть супер класс в котором прописаны все слушатели и обработчики. И остальные классы ( загрузка битмапов, звука и т.д. ) наследуются от этого супер класса, но они не чего не решают. Они по событиям уведомляют супер класс, который уже решает, что с чем делать. То есть он как контроллер. И мне интересно - это нормальный подход, вот так вот делать?

Я тоже так делаю :)

Добавлено через 2 минуты
То есть он являясь супер классом, является ещё и менеджером?
Ведь когда одна загрузка завершилась, он говорит, что нужно грузить следующую ссылку..

Нет. просто он делает одно общее дело за детей.

sospamom
19.09.2013, 17:52
class Motion {
function run() {
trace("motion run");
}
}

class Linear extends Motion {
function line() {

}
}

class Circular extends Motion {
function circle() {

}
}

class FirstLinear extends Linear {
override function run() {
trace("first run");
}
}

class SecondLinear extends Linear {
override function run() {
trace("second run");
}
}

class ThirdLinear extends Linear {
override function run() {
trace("third run");
}
}

class FourthLinear extends Linear {
override function run() {
trace("fourth run");
}
}

class FirstCircular extends Circular {
override function run() {
trace("first run");
}
}

class SecondCircular extends Circular {
override function run() {
trace("second run");
}
}

class ThirdCircular extends Circular {
override function run() {
trace("third run");
}
}

class FourthCircular extends Circular {
override function run() {
trace("fourth run");
}
}

AlexCooper
19.09.2013, 19:14
Вас не устраивают оверрайды?
Ну можно написать примерно так ( хотя я не исключено что могу глубоко ошибаться так как никогда так не делал)

class Linear extends Motion {
function line() {

}

override function run() {
if (this is FirstLinear) trace("first run");
if (this is SecondLinear) trace("2 run");
if (this is ThirdLinear ) trace("3 run");
if (this is FourthLinear ) trace("4 run");
}
}
но врятли что-то это сократит да и вообще херит ООП, лучше мне кажется вывести переменную и от неё плясать, если FirstLinear, SecondLinear, ThirdLinear , FourthLinear работают одинаково с каким-то исключением вроди толщины линии, тогда может и вовсе не нужно это клонирование классов. В чём разница между этими классами?

sospamom
19.09.2013, 21:06
спасибо