powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Наследование, какого потомка выбрать
32 сообщений из 32, показаны все 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
Наследование, какого потомка выбрать
    #39272505
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВИзопропила как же быть, если треугольник одновременно равнобедренный и прямоугольный?
А у тебя треугольник с точки зрения Евклида или Лобачевского?
для начала - в конечномерном пространстве, метрикой - пусть кто-нибудь другой озаботатится
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272535
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lskПользователь вводит 3 точки

это условие сбивает с толку.

можно так построить классы
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
public interface ISquared//что-то, имеющее площадь
    {        
        double GetSquare();
    }

    public class A : ISquared//треугольник по координатам вершин
    {
        private double x1;
        private double x2;
        private double x3;

        private double y1;
        private double y2;
        private double y3;
                
        public A(double x1, double y1, double x2, double y2, double x3, double y3)
        {
            this.x1 = x1;
            this.y1 = y1;
            this.x2 = x2;
            this.y2 = y2;
            this.x3 = x3;
            this.y3 = y3;
        }
        public virtual double GetSquare() 
        {
            return 0.5 * ( (x1 - x3) * (y2 - y3) - (x2 - x3) * (y1 - y3) ); 
        }
    }

    public class B : ISquared //равносторонний треугольник
    {
        private double a;

        public B(double a)
        {
            this.a = a;
        }
        public double GetSquare() 
        {
            return a * a * Math.Sqrt(3) / 4; 
        }
    }

    public class C : ISquared //равнобедренный треугольник
    {
        private double a;
        private double alpha;

        public C(double a, double alpha)
        {
            this.a = a;
            this.alpha = alpha;
        }
        public double GetSquare() 
        {
            return a * a * Math.Sin(alpha); 
        }
    }

    public class D : ISquared //прямоугольный треугольник
    {
        private double a;
        private double b;
        public D(double a, double b)
        {
            this.a = a;
            this.b = b;
        }
        public double GetSquare() 
        { 
            return a * b / 2; 
        }
    }



и тогда вообще становится не принципиально, кто и от кого наследовался, и как создался - есть площать, отдай. и задача приобретает смысл
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272544
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lskСделал через фабричный метод

если этот метод создает экземпляр нужного класса, выполняя проверки точек на нужный тип треугольника, то это не фабричный метод: как я с его помощью получу равносторонний 3-к, который равнобедренный?
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272568
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MineRunnerИзопропила как же быть, если треугольник одновременно равнобедренный и прямоугольный?
Тогда первый кейс, что сработал, по нему и определять площадь.

жестко. тогда лучше сразу отдавать площать и не мучить высосанное из пальца наследование от A
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272586
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё один смешной момент - координаты в double - все треугольники общего вида будут
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272627
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилЕвгенийВпропущено...

А у тебя треугольник с точки зрения Евклида или Лобачевского?
для начала - в конечномерном пространстве, метрикой - пусть кто-нибудь другой озаботатится
Площадь будем мерить по Жордану или по Лебегу или по Хаусдорфу?
...
Рейтинг: 0 / 0
Наследование, какого потомка выбрать
    #39272643
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

по Жордану
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Наследование, какого потомка выбрать
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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