Всем привет! Изучаю Объектно Ориентированное Проектирование и столкнулся с такой проблемой: у меня есть класс Shape, от него наследуются классы Triangle, Circle, Rectangle. Как сделать так, чтобы можно было отрисовывать объекты Core Graphics во View, методами каждого из этих классов Фигур?
Рисование фигур в CoreGraphics методами классов
В ООП «п» это не проектирование. А так задача стандартная. Используй полиморфизм. Но я бы протоколы использовал.
А какие там методы?
Можно например так:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let myView = MyView()
myView.backgroundColor = .gray
myView.frame.size = CGSize(width: 100, height: 100)
myView.center = view.center
view.addSubview(myView)
myView.draw(Rectangle())
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
myView.draw(Circle())
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
myView.draw(Triangle())
}
}
}
}
class Shape {
func path(_ size: CGSize) -> UIBezierPath {
fatalError()
}
}
class Rectangle: Shape {
override func path(_ size: CGSize) -> UIBezierPath {
return UIBezierPath(rect: CGRect(x: 1, y: 1, width: size.width - 2, height: size.height - 2))
}
}
class Circle: Shape {
override func path(_ size: CGSize) -> UIBezierPath {
return UIBezierPath(ovalIn: CGRect(x: 1, y: 1, width: size.width - 2, height: size.height - 2))
}
}
class Triangle: Shape {
override func path(_ size: CGSize) -> UIBezierPath {
let path = UIBezierPath()
path.move(to: CGPoint(x: size.width / 2, y: 1))
path.addLine(to: CGPoint(x: size.width - 1, y: size.height - 1))
path.addLine(to: CGPoint(x: 1, y: size.height - 1))
path.close()
return path
}
}
class MyView: UIView {
private var path: UIBezierPath?
override func draw(_ rect: CGRect) {
path?.stroke()
path?.lineWidth = 1
UIColor.black.setStroke()
}
func draw(_ shape: Shape) {
path = shape.path(frame.size)
setNeedsDisplay()
}
}
OOP - Объектно Ориентированное Программирование
OOD - Объектно Ориентированное Проектирование
образно дается на вход строка: “Triangle 20 30 15”, после мы считываем строку и определяем, к какому классу относится фигура и уже рисуем ее во View методами, определенными в классе Triangle/Rectangle/Shape.
Жесть какая. Что вы от джуниора хотите?
Только ООП (как пишут всякие бородатые дядьки) это не “программирование”, а “парадигма”. ( Паради́гма (от греч. παράδειγμα, «пример, модель, образец») — совокупность фундаментальных научных установок, представлений и терминов, принимаемая и разделяемая научным сообществом и объединяющая большинство его членов. Обеспечивает преемственность развития науки и научного творчества.)
Но с другой стороны, какая разница, раз мы о понятиях договорились.
Я малограмотный конечно, но вот если ты с сети или как-то иначе получаешь именно строку, и парсишь ее. Ну тогда надо делать класс-фабрику. Которая получая одни данные, будет выдавать Shape. В котором будет лежать либо треугольник либо квадрат либо что-то еще. И у кого будет метод draw, который и будет ее рисовать.
И я бы уходил от ООП в сторону ПОП.
да, вопрос того, как получать и рисовать то он прост. Немного не понимал, как сделать так, чтобы во вью использовались методы какого-либо класса фигур)