powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Наследование, какого потомка выбрать
25 сообщений из 32, страница 1 из 2
Наследование, какого потомка выбрать
    #39271913
lsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lsk
Гость
Есть 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.
class A
{
    public virtual double GetSquare() { ... }
}

class B : A
{
    public override double GetSquare() { ... }
}

class C : A
{
    public override double GetSquare() { ... }
}

class D : A
{
    public override double GetSquare() { ... }
}



Подскажите, пожалуйста, как правильно объявить переменную нужного класса. Пользователь вводит 3 точки и нажимает кнопку посчитать площадь, нужно:
если треугольник равносторонний, то площадь считалась методом из класса B,
если равнобедренный, то из класса С,
если прямоугольный, то из класса D,
а если никакой из этих трех, то тогда методом их класса A

У меня только одна идея, сделать в конструкторе каждого класса проверку на принадлежность к данному типу треугольника и если не выполняется, то кидать экшепшн и пробовать создать переменную каждым типом подряд до тех пор, пока какой-то конструктор сработает, но мне кажется это плохая идея самому кидать эксепшены.
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39271916
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lsk, внимательно прочитайте следующую статью: Полиморфизм (Руководство по программированию на C#)
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39271936
lsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lsk
Гость
skyANA, у меня задача немного наоборот, если бы я бы проинициализировал переменную нужным классом потомком, то как потом вызывать через базовый класс метод я знаю,
а я изначально не знаю каким именно классом инициализировать переменную, а делать отдельно три проверки на три типа треугольника, чтобы потом в case создавать нужный, тоже как-то неправильно, половина логики будет вне классов.
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39271942
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lsk, а теперь нормально объясните, что у Вас не получается.

Не знаете как по точкам определить вид треугольника?
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39271958
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lskа я изначально не знаю каким именно классом инициализировать переменнуютак это и неизвестно до тех пор пока пользователь точки не ткнул. правила ооп разруливаются на этапе компиляции, а на этом этапе еще нет никаких точек.

lskа делать отдельно три проверки на три типа треугольника, чтобы потом в case создавать нужный, тоже как-то неправильно, половина логики будет вне классов. другого решения тут и не выйдет.
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39271961
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lsk У меня только одна идея, сделать в конструкторе каждого класса проверку на принадлежность к данному типу треугольника и если не выполняется, то кидать экшепшн и пробовать создать переменную каждым типом подряд до тех пор, пока какой-то конструктор сработает, но мне кажется это плохая идея самому кидать эксепшены.Это крайне хреновый способ в плане быстродействия, но если это нужно делать не несколько раз в секунду, то можно.
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39271966
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lsk, это задача на ооп... или про дядьку Герона не слышали?
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39271991
lsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lsk
Гость
Когда дохожу до места в коде, где хочу создать переменную класса треугольника, то уже имею три точки.
Как определить тип треугольника по точкам тоже знаю.

Уточнял в каком именно месте лучше определять тип треугольника, до создания или уже внутри самих классов.

Antonariy другого решения тут и не выйдет.
буду тогда делать проверки, спасибо
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39271999
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lskУточнял в каком именно месте лучше определять тип треугольника, до создания или уже внутри самих классов.
Вынесите в фабричный метод, что на входе принимает три точке, а на выходе подходящий треугольник.
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272004
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В классе А делаете статический метод GetTriangle, принимащий на вход вершины треугольника и возвращающий объект типа А.

А в самом методе анализируете, что там за треугольник, создаете нужный и возвращаете обратно.

+ посмотрите Фабричный метод
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272006
lsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lsk
Гость
О, спасибо, попробую фабричный метод сделать
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272027
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lskО, спасибо, попробую фабричный метод сделатьсобственно, это и есть метод на "три проверки на три типа треугольника, чтобы потом в case создавать нужный", в котором "половина логики будет вне классов".
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272039
MineRunner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lskКогда дохожу до места в коде, где хочу создать переменную класса треугольника, то уже имею три точки.
Как определить тип треугольника по точкам тоже знаю.

Уточнял в каком именно месте лучше определять тип треугольника, до создания или уже внутри самих классов.

Antonariy другого решения тут и не выйдет.
буду тогда делать проверки, спасибо
Пиши один метод определения площади в базовом классе. В самом методе проверку на тип треугольника по точкам.

skyANAlskУточнял в каком именно месте лучше определять тип треугольника, до создания или уже внутри самих классов.
Вынесите в фабричный метод, что на входе принимает три точке, а на выходе подходящий треугольник.
Занафига, если надо площадь посчитать, а не треугольники городить? Я тут вообще не понимаю, зачем иерархию классов делать, если до прихода точек определить тип треуольника нельзя. Разве что задание такое - соорудить иерархию классов.
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272040
MineRunner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А лучше так - один публичный метод GetSquare в базовом классе, и три закрытых - в каждом из соответсвтующих. Публичный определяет тип треуольника и вызывает один из закрытых, чей результат и возвращает.

Фабрики тут какие-то - у половины народа тут шаблоны мозг выели.
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272042
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как же быть, если треугольник одновременно равнобедренный и прямоугольный?
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272043
MineRunner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то типа такого

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
class A
{
    public double GetSquare() { /* тут определяем тип треугольника и вызываем GetSquareValue() */ }
    protected virtual double GetSquareValue() { /* тут пусто */ }
}

class B : A
{
    private override double GetSquareValue() { ... }
}

class C : A
{
    private override double GetSquareValue() { ... }
}

class D : A
{
    private override double GetSquareValue() { ... }
}



Можно класс А сделать абстрактным и метод GetSquareValue асбтрактным.
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272044
MineRunner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропила как же быть, если треугольник одновременно равнобедренный и прямоугольный?
Тогда первый кейс, что сработал, по нему и определять площадь.
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272046
MineRunner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, да, у меня тут тоже какой-то паттерн - стратегия, чтоли.
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272049
MineRunner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MineRunnerА, да, у меня тут тоже какой-то паттерн - стратегия, чтоли.
Чем у меня лучше, чем у других - я не создаю объект треугольника (кто знает, сколько у него данных). Нафига создавть треугольник, когда можно тупо перекинуть точки в нужный метод и найти площадь?
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272051
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MineRunnerMineRunnerА, да, у меня тут тоже какой-то паттерн - стратегия, чтоли.
Чем у меня лучше, чем у других - я не создаю объект треугольника (кто знает, сколько у него данных). Нафига создавть треугольник, когда можно тупо перекинуть точки в нужный метод и найти площадь?
А у меня для всех типов треугольников один метод вычисления площади Это учебная задача... +1 за фабрику :)
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272053
MineRunner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buserMineRunnerпропущено...

Чем у меня лучше, чем у других - я не создаю объект треугольника (кто знает, сколько у него данных). Нафига создавть треугольник, когда можно тупо перекинуть точки в нужный метод и найти площадь?
А у меня для всех типов треугольников один метод вычисления площади Это учебная задача... +1 за фабрику :)
В смысле? Пофиг на площадь, надо сгородить иерархию классов? Ну, тогда да - фабрика.
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272054
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а чё равносторонний не является наследником равнобедренного?
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272055
lsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lsk
Гость
Как раз и была основная задача соорудить иерархию классов и для вопроса я описание функционала сократил, будут и треугольники рисоваться и ещё разные другие вычисления. Сделал через фабричный метод, всем спасибо за объяснения.
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272324
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропила как же быть, если треугольник одновременно равнобедренный и прямоугольный?
А у тебя треугольник с точки зрения Евклида или Лобачевского?
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272331
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть еще такое решение: сказать преподавателю, что задача для ООП не годится
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Наследование, какого потомка выбрать
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]