Здравствуйте, DarkGray, Вы писали:
DG>Здравствуйте, Кирилл Осенков, Вы писали:
DG>>>Все операции для эллипса доступны и для круга.
КО>>Ну не знаю. А операция "сжать в n раз к большей оси? А как насчет провести прямую через фокусы?
DG>Считаем, что для круга ось, например, всегда вертикальна
DG>DG>class Ellipse
DG>{
DG> virtual Vector BigAxis {get {return (Focus1 - Focus2).Normalize();}}
DG>}
DG>class Circle:
DG> Ellipse
DG>{
DG> override Vector BigAxis {get {return new Vector(0, 1);}}
DG>}
DG>
DG>тогда все эти операции продолжают работать.
Попался!
Грабли номер 1: в императивных языках с поддержкой ООП есть ограничение на операции. Они должны быть замкнуты, т. е. не выводить экземпляр класса из этого класса. Для функциональных языков это не так, но это случай отдельный и экзотический.
Применение stretch ("сжать в n раз к большей оси") в твоем примере выведет экземпляр Circle из класса Circle, и он станет эллипсом (так как ты все-таки согласился ввести ось для круга). Если не согласен, то просто попробуй написать метод stretch.