![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| korob2001 |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 1 Всего: 61 |
Привет!
Мне нужно написать класс который получает 2 числа, это могут быть числа byte, short, int, long, double, float или char. Он сохраняет эти данные в своих полях. Так же есть методы intDiapason(), floatDiapason(), doubleDiapason() и так для каждого типа. Метод возвращает массив чисел соответствующего типа, в заданном диапазоне. Например можно вызвать класс так из командной строки:
Всё вроде бы ничего, но проблема в том, что я не могу спроектировать это. Так как тип заранее не известен, а писать для каждого типа отдельный класс помоему, это не есть верно, а может просто я достаточно ленив? Вобщем единственное что пришло в голову, это написать интерфейс:
Затем написал класс, который реализует его:
Изначально я предполагал написать этот класс, для типа int, но когда реализовал и остальные методы, то подумал, а нужен ли вообще здесь интерфейс? Подскажите, как грамотнее спроектировать данный класс? Как вы определяете, где заюзать интерфейс, а где абстрактный класс? Что-то я вообще запутался. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||
|
|||||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15719 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
В данном случае это верно Я бы сделал базовый абстрактный класс с реализацией методов xxxDiapason() а вот setDiapason() вынес бы в конкретную реализацию. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 1 Всего: 61 |
Да, но насколько я понял. я должен указать тип возвращаемого значения метода xxxDiapason(), в абстрактном классе. А какой, он же может возвращать любой массив типа byte, short, int, long, double, float, char? Если бы возвращаемое значение было бы void, и весь диапазон печатался внутри метода, то проблем не было бы. ;((((( Добавлено @ 00:36 Вроде дошло Вот о чём подумал: В интерфейсе обьявить 2 метода getDiaposon() и setDiaposon(), затем каждый класс будет их реализовывать для своего типа. Затем создать класс Diaposon и перегрузить его конструкторы для каждого типа, они и будут возвращать нужный объкт, в зависимости от того, какого типа были получены параметры. Или я опять, что-то намудрил? Да, вних же тоже я должен укзать тип возвращаемого значения и тип аргументов, которые будет получать метод setDiaposon(тип x, тип у). ;((((( Это сообщение отредактировал(а) korob2001 - 17.3.2006, 00:41 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15719 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
1. Вот ты привел пример класса IntDiapason и там есть методы intDiapason(), doubleDiapason() и т.д. для всех числовых типов. Так почему бы их не вынести в базовый класс? А реализация должна будет только предоставить границы для этого диапазона.
2. Всегда есть выход возвращать Object и приводить его потом к правильному типу массива. Или как вариант, использовать массивы не примитивных типов, а Number[] а в него класть Integer, Double и т.д. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 24 Всего: 144 |
korob2001, коль скоро речь идет о проектировании, будет гораздо лучше, если ты сначала расскажешь, чего ты вообще хочешь добиться. Простыми словами. Ну как в том анекдоте: "ты не умничай, ты пальцем покажи"
Сдается мне, что твою задачу можно решить и проще. Например, я вижу, как тут мог бы помочь класс BigDecimal. Но тогда задачу придется переформулировать. А для этого нужно знать исходные требования. Так что пиши |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 1 Всего: 61 |
1.) Создать класс Diaposon, коструктору будут переданы аргументы: например new Diaposon(100,150). В данном случае, это аргументы типа int, но они могут быть и doble и short и char и т.д. Возможно чуть позже понадобится ещё один аргумент, step, сейчас можно обойтись и без него, используюя шаг в единицу. Опять же тип поля step должет быть того же типа, что и сам диапазон чисел.
2.) В классе Diaposon должен быть метод, который возвращает массив чисел в заданном диапозоне. Тип возвращаемого массива зависит от того, какого типа были переданы параметры. PS: Аргументы передаваемые конструктору каласса не могут быть разного типа, т.е. они оба либо int, либо short, либо char и т.д. Именно от того какого типа были аргументы и зависит тип возвращаемого массива, который возвращает метод getDiaposon() Это сообщение отредактировал(а) korob2001 - 17.3.2006, 01:05 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 24 Всего: 144 |
korob2001, что должен делать твой класс в общих чертах понятно из предыдущего описания. Непонятно другое: для чего тебе нужен класс с таким поведением и нужен ли вообще. То есть где и как ты его собираешься использовать?
Ну а в том виде, в каком ты его хочешь, можно пойти таким путем. 1. Во-первых, переменные start и stop не могут быть типа int, а иначе при касте из long, float и double может теряться точность. Значит нужно или заводить переменные разных типов, или приводить все к такому типу, который мог бы вместить в себя любые другие: например double. 2. Далее делаешь примерно так, как у тебя в коде, но в каждом методе при присвоении значений элементам массива кастишь к нужному типу. 3. Если метод xxxDiapason() вызывается много раз и производительность критична, то можно массивы вынести в локальные переменные (по одной на каждый тип) и инициализировать или при создании класса, или по первому обращению (ленивая инициализация). 4. Вместо того чтобы заводить десять конструкторов, можно обойтись одним, который принимает два числовых аргумента в виде строк плюс еще один дополнительный параметр - тип диапазона. Кстати, поскольку мы теперь можем сгенерировать массив любого типа, то и нет смысла заранее себя ограничивать, так что я бы просто обошелся конструктором с двумя double и конструктором с двумя String. 5. Можно вообще сделать класс с одними статическими методами, к которому можно обращаться так:
Короче, вариантов море. Все зависит от того, как ты это собираешься использовать. А ты об этом молчишь, как партизан |
|||
|
||||
| korob2001 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 1 Всего: 61 |
Stampede
Да это не секрет, просто хочется чего-нить написать, с интерфейсом, я их сейчас проходил.
А это код, который использует этот класс:
Спасибо вам за помощь, наверное я не там решил заюзать интерфейсы, а так хотелось. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||
|
|||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |