|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
Есть 4 класса: A - треугольник B - равносторонний треугольник C - равнобедренный треугольник D - прямоугольный треугольник GetSquare() - метод, который считает площадь треугольника (в каждом классе своя формула подсчета) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Подскажите, пожалуйста, как правильно объявить переменную нужного класса. Пользователь вводит 3 точки и нажимает кнопку посчитать площадь, нужно: если треугольник равносторонний, то площадь считалась методом из класса B, если равнобедренный, то из класса С, если прямоугольный, то из класса D, а если никакой из этих трех, то тогда методом их класса A У меня только одна идея, сделать в конструкторе каждого класса проверку на принадлежность к данному типу треугольника и если не выполняется, то кидать экшепшн и пробовать создать переменную каждым типом подряд до тех пор, пока какой-то конструктор сработает, но мне кажется это плохая идея самому кидать эксепшены. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 17:10 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
lsk, внимательно прочитайте следующую статью: Полиморфизм (Руководство по программированию на C#) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 17:13 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
skyANA, у меня задача немного наоборот, если бы я бы проинициализировал переменную нужным классом потомком, то как потом вызывать через базовый класс метод я знаю, а я изначально не знаю каким именно классом инициализировать переменную, а делать отдельно три проверки на три типа треугольника, чтобы потом в case создавать нужный, тоже как-то неправильно, половина логики будет вне классов. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 17:27 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
lsk, а теперь нормально объясните, что у Вас не получается. Не знаете как по точкам определить вид треугольника? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 17:31 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
lskа я изначально не знаю каким именно классом инициализировать переменнуютак это и неизвестно до тех пор пока пользователь точки не ткнул. правила ооп разруливаются на этапе компиляции, а на этом этапе еще нет никаких точек. lskа делать отдельно три проверки на три типа треугольника, чтобы потом в case создавать нужный, тоже как-то неправильно, половина логики будет вне классов. другого решения тут и не выйдет. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 17:40 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
lsk У меня только одна идея, сделать в конструкторе каждого класса проверку на принадлежность к данному типу треугольника и если не выполняется, то кидать экшепшн и пробовать создать переменную каждым типом подряд до тех пор, пока какой-то конструктор сработает, но мне кажется это плохая идея самому кидать эксепшены.Это крайне хреновый способ в плане быстродействия, но если это нужно делать не несколько раз в секунду, то можно. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 17:42 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
lsk, это задача на ооп... или про дядьку Герона не слышали? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 17:48 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
Когда дохожу до места в коде, где хочу создать переменную класса треугольника, то уже имею три точки. Как определить тип треугольника по точкам тоже знаю. Уточнял в каком именно месте лучше определять тип треугольника, до создания или уже внутри самих классов. Antonariy другого решения тут и не выйдет. буду тогда делать проверки, спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 18:12 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
lskУточнял в каком именно месте лучше определять тип треугольника, до создания или уже внутри самих классов. Вынесите в фабричный метод, что на входе принимает три точке, а на выходе подходящий треугольник. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 18:29 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
В классе А делаете статический метод GetTriangle, принимащий на вход вершины треугольника и возвращающий объект типа А. А в самом методе анализируете, что там за треугольник, создаете нужный и возвращаете обратно. + посмотрите Фабричный метод ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 18:35 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
О, спасибо, попробую фабричный метод сделать ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 18:49 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
lskО, спасибо, попробую фабричный метод сделатьсобственно, это и есть метод на "три проверки на три типа треугольника, чтобы потом в case создавать нужный", в котором "половина логики будет вне классов". ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 19:25 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
lskКогда дохожу до места в коде, где хочу создать переменную класса треугольника, то уже имею три точки. Как определить тип треугольника по точкам тоже знаю. Уточнял в каком именно месте лучше определять тип треугольника, до создания или уже внутри самих классов. Antonariy другого решения тут и не выйдет. буду тогда делать проверки, спасибо Пиши один метод определения площади в базовом классе. В самом методе проверку на тип треугольника по точкам. skyANAlskУточнял в каком именно месте лучше определять тип треугольника, до создания или уже внутри самих классов. Вынесите в фабричный метод, что на входе принимает три точке, а на выходе подходящий треугольник. Занафига, если надо площадь посчитать, а не треугольники городить? Я тут вообще не понимаю, зачем иерархию классов делать, если до прихода точек определить тип треуольника нельзя. Разве что задание такое - соорудить иерархию классов. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 19:55 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
А лучше так - один публичный метод GetSquare в базовом классе, и три закрытых - в каждом из соответсвтующих. Публичный определяет тип треуольника и вызывает один из закрытых, чей результат и возвращает. Фабрики тут какие-то - у половины народа тут шаблоны мозг выели. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 19:57 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
а как же быть, если треугольник одновременно равнобедренный и прямоугольный? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 20:00 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
Что-то типа такого Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Можно класс А сделать абстрактным и метод GetSquareValue асбтрактным. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 20:02 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
Изопропила как же быть, если треугольник одновременно равнобедренный и прямоугольный? Тогда первый кейс, что сработал, по нему и определять площадь. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 20:03 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
А, да, у меня тут тоже какой-то паттерн - стратегия, чтоли. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 20:07 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
MineRunnerА, да, у меня тут тоже какой-то паттерн - стратегия, чтоли. Чем у меня лучше, чем у других - я не создаю объект треугольника (кто знает, сколько у него данных). Нафига создавть треугольник, когда можно тупо перекинуть точки в нужный метод и найти площадь? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 20:11 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
MineRunnerMineRunnerА, да, у меня тут тоже какой-то паттерн - стратегия, чтоли. Чем у меня лучше, чем у других - я не создаю объект треугольника (кто знает, сколько у него данных). Нафига создавть треугольник, когда можно тупо перекинуть точки в нужный метод и найти площадь? А у меня для всех типов треугольников один метод вычисления площади Это учебная задача... +1 за фабрику :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 20:17 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
buserMineRunnerпропущено... Чем у меня лучше, чем у других - я не создаю объект треугольника (кто знает, сколько у него данных). Нафига создавть треугольник, когда можно тупо перекинуть точки в нужный метод и найти площадь? А у меня для всех типов треугольников один метод вычисления площади Это учебная задача... +1 за фабрику :) В смысле? Пофиг на площадь, надо сгородить иерархию классов? Ну, тогда да - фабрика. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 20:22 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
а чё равносторонний не является наследником равнобедренного? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 20:27 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
Как раз и была основная задача соорудить иерархию классов и для вопроса я описание функционала сократил, будут и треугольники рисоваться и ещё разные другие вычисления. Сделал через фабричный метод, всем спасибо за объяснения. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2016, 20:29 |
|
Наследование, какого потомка выбрать
|
|||
---|---|---|---|
#18+
Изопропила как же быть, если треугольник одновременно равнобедренный и прямоугольный? А у тебя треугольник с точки зрения Евклида или Лобачевского? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2016, 12:03 |
|
|
start [/forum/topic.php?fid=20&fpage=58&tid=1400470]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 152ms |
0 / 0 |