Рисование фигур в CoreGraphics методами классов

swift4

#1

Всем привет! Изучаю Объектно Ориентированное Проектирование и столкнулся с такой проблемой: у меня есть класс Shape, от него наследуются классы Triangle, Circle, Rectangle. Как сделать так, чтобы можно было отрисовывать объекты Core Graphics во View, методами каждого из этих классов Фигур?


#2

В ООП «п» это не проектирование. А так задача стандартная. Используй полиморфизм. Но я бы протоколы использовал.


#3

А какие там методы?

Можно например так:

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()
    }
}


#5

OOP - Объектно Ориентированное Программирование
OOD - Объектно Ориентированное Проектирование :wink:


#6

образно дается на вход строка: “Triangle 20 30 15”, после мы считываем строку и определяем, к какому классу относится фигура и уже рисуем ее во View методами, определенными в классе Triangle/Rectangle/Shape.


#7

Жесть какая. Что вы от джуниора хотите?
Только ООП (как пишут всякие бородатые дядьки) это не “программирование”, а “парадигма”. ( Паради́гма (от греч. παράδειγμα, «пример, модель, образец») — совокупность фундаментальных научных установок, представлений и терминов, принимаемая и разделяемая научным сообществом и объединяющая большинство его членов. Обеспечивает преемственность развития науки и научного творчества.)

Но с другой стороны, какая разница, раз мы о понятиях договорились.


#8

ну, если обширно, то да)


#9

Я малограмотный конечно, но вот если ты с сети или как-то иначе получаешь именно строку, и парсишь ее. Ну тогда надо делать класс-фабрику. Которая получая одни данные, будет выдавать Shape. В котором будет лежать либо треугольник либо квадрат либо что-то еще. И у кого будет метод draw, который и будет ее рисовать.

И я бы уходил от ООП в сторону ПОП.


#10

да, вопрос того, как получать и рисовать то он прост. Немного не понимал, как сделать так, чтобы во вью использовались методы какого-либо класса фигур)


#11

Если наследование берешь, то все в базовый класс выносишь.