Только недавно вплотную столкнулся с ООП и написанием своих классов в частности.
Нужен совет по релизации классов.
Есть базовый абстрактный класс с именем, допустим, Shape. Он имеет абстрактный метод Draw.
От Shape наследуются дочерние классы Line, Point, Ellipse и тп.
Все они требуют разного количества координат для рисования. Что вполне логично.
Но при полиморфизме должна отличаться одна лишь только реализация, а описание, в том числе и количество параметров должно быть такое же.
Так как же мне передавать объектам моих дочерних классов разное количество параметров? (перегрузка методов при полиморфизме, как я понял, невозможна)
Хотелось бы найти наиболее красивое решение данной проблемы.
Кода не надо, достаточно теоретического совета.
[Ответ]
дядя Дима 22:03 03.11.2009
есть не самое красивое но простое решение- во всех методах на входе будет массив координат ,каждый метод будет использовать нужное ему количество координат, отрабатывать только случай если передано не правильное количество значений- по размерности массива
[Ответ]
X0R 23:02 03.11.2009
В C# можно использовать params
Сообщение от :
Ключевое слово params позволяет определить параметр метода, принимающий аргумент, в котором количество аргументов является переменным.
В объявлении метода после ключевого слова params дополнительные параметры не допускаются, и в объявлении метода допускается только одно ключевое слово params.
[PHP]public static void UseParams(params int[] list)
{
for (int i = 0 ; i < list.Length; i++)
{
Console.Write(list[i] + " ");
}
Console.WriteLine();
}[/PHP]
[Ответ]
lukas 23:25 03.11.2009
можно проектировать более подругому. инкапсулировать параметры в классах. соответсвенно Draw будет без параметров. нет параметров - нет проблемы)
[Ответ]
mexx 09:38 04.11.2009
дядя Дима, думал над этим lukas, это совсем уж некрасиво X0R, выглядит неплохо. попробую так. к тому же пишу как раз на шарпе
[Ответ]
lukas 09:52 04.11.2009
некрасиво? ну тогда читай снова про ооп. с самого начала. потом спроси у себя - каково предназначение класса шейп и всей иерархии, если ты передаёшь все параметры в Draw. повторить пока не придёт понимание)
[Ответ]
DeniSS1 14:12 04.11.2009
Не помню, можно ли так делать в С++ (всё уже забыл, т.к. першёл на AS3)
[PHP]#include <limits.h>
draw(int x1=INT_MAX, int y1=INT_MAX, int x2=INT_MAX, int y2=INT_MAX /*...и так далее*/)
{
if((x2==INT_MAX) && (y2==INT_MAX)) // рисуем точку
else if ((x3==INT_MAX) && (y3==INT_MAX)) // рисуем прямую
//и т.д.
}[/PHP]
[Ответ]
Yandex 15:22 04.11.2009
DeniSS1, жуууууть Мне вариант от lukas наиболее симпатичен, хотя в ООП разбираюсь как свинья в апельсинах.
[Ответ]
DeniSS1, а если нам надо передать 1000 координат?) lukas, может быть я неправ. почитаю еще. все городится для того, чтобы у нас были дочерние классы, имели разную реализацию метода Draw. А разная реализация,в данном случае, требует и разного количества входных параметров.
Просто, на мой взгляд, передавать координаты как параметры метода - наиболее понятно. И в будущем не будет лишних вопросов, если придется вернуться к этому коду
[Ответ]
lukas 15:48 04.11.2009
Сообщение от mexx: DeniSS1, а если нам надо передать 1000 координат?) lukas, может быть я неправ. почитаю еще
ну я готов обсудить, всё равно пока бесдельничаю) полиморфизм нужен тогда когда конкретный тип не известен(не нужен). например - вызвать функцию Draw без параметров а там уже конкретные классы рисуют как им вздумается в зависимости от фазы луны и прочего. Если ты хочеж вызывать Draw с параметрыми определенными, значит тебе во-первых известен конкретный тип, во-вторых, ты можешь скастить до него и вызывать нужный тайп специфик мембер. в третьих, если никаких данные не инкапсулируются в классах - то в чом тогда их назначение? можно обойтись статическим методом в какотом из неймспейсов, чтоб глобальный не засорять. полезно себя спрашывать зачем я делаю так а не эдак. обсуждать с другими впрочем завсегда полезней [Ответ]
MadFish 16:44 04.11.2009
Не, я конечно согласен с lukas, тут налицо ошибка в проектировании, но если человеку так хочется грязных извращений путь поставит ... в списке параметров Draw базового класса
mexx, делай Draw функцией с неопределенным количеством параметров, тогда "каша" в твоем коде будет полной !!! гарантированно никто не разберется
Придумал еще прикольнее- в потомках еще и переопределять виртуальную Draw базового класса изменяя число фиксированных параметров (вынос мозга ахахаха)!!! А вы говорите перл трудно читать [Ответ]
mexx 16:45 04.11.2009
lukas, просто это задача в универе на полиморфизм)
грубо говоря написать мини-графический редактор с несколькими примитивами, используя полиморфизм. Поэтому в общем и интересно.
[Ответ]
QuickSilver 22:02 04.11.2009
Если задача учебная, то за "костыли и подпорки" могут заставить переписывать. Если преподаватель код смотрит, конечно. Про идеологию ООП, на мой вкус, хорошо и понятно написано у Лафоре
[Ответ]
mexx 17:18 05.11.2009
так какое наиболее правильное решение? Инкапсуляция параметров в дочернем классе?
[Ответ]
MadFish 17:26 05.11.2009
Свои координаты объекты хранят сами. Draw без параметров отрисовывает объект. Классическое решение классической задачки в любой книжке по азам ООП.
[Ответ]
mexx,
Самый верный вариант у MadFish.
Но если параметры действительно нужно передавать, то во многих языках существуют конструкции для передачи произвольного числа параметров.
Например в Java:
Код:
public abstract List<Domain> getDomains(Params... params) {}
Также можно использовать некий класс или интерфейс в качестве параметра. Соотвественно, количество переменных должно быть масштабируемо внутри передаваемого класса.
Опять Java:
Код:
public abstract List<Domain> getDomains(List<Params> params) {}