Потрібно написати програму, яка містить клас Triangle. В даному класі повинно бути три конструктора:
- Конструктор, який приймає три сторони.
- Конструктор, який приймає дві сторони і кут між ними і розраховує третю сторону по теоремі косинусів.
- Конструктор, який приймає два кута і сторону між ними і розраховує, що залишилися боку по теоремі синусів (пам'ятаючи про теорему про суму кутів трикутника).
Кожен Triangle також повинен повертати власну площу.
Тобто маємо наступне:
Вся проблема в тому, що у всіх трьох конструкторів однакова сигнатура, але різна логіка.
Питання: як вирішити цю проблему "правильно"?
- Заміна параметра (ів) double на string і подальший парсинг string в double.
- Заміна параметра (ів) double на float.
Винесення параметрів в масив:
заданий 27 Вересня '16 в 5:42
Варіант 1 - використовуйте іменовані конструктори.
Іменованих конструктором називається статичний метод, завдання якого - створити об'єкт із заданими параметрами. Іноді їх ще не цілком коректно називають фабричними методами.
Варіант 2 - використовувати доменні типи даних
Визначаємо типи даних "довжина" і "кут" - і використовуємо їх в конструкторах.
Пара альтернативних варіантів до вже запропонованих.
Оскільки вибір перевантаженої функції (і конструктора в тому числі) здійснюється на підставі типів, зрозуміло, що створити кілька різних конструкторів з однаковими сигнатурами не вийде.
Проблему можна вирішити шляхом додавання додаткового параметра.
Заводяться нові "порожні" класи (імена взяв з відповіді @Argon):
Сигнатури конструкторів в цьому випадку будуть наступні:
Використовується перерахування enum.
В цьому випадку конструктор буде єдиний з розгалуженням логіки всередині:
При цьому для аргументу kind можна задати значення за замовчуванням, якщо планується, що буде переважати той чи інший варіант побудови трикутника. наприклад: