Sobes.tech
Middle

Абстракттык класстар жөнүндө сөз болгондо протоколдор менен класстар ортосунда кандай айырма бар?

sobes.tech AI

AIден жооп

Протокол аныктоо келишим — талаптардын топтому (методдор, касиеттери, инициализаторлор), бул протоколго ылайык келген тип аткаруусу керек. Протоколдор көпчүлүк талаптардын ишке ашырылышын камтыбайт. Протоколдон экземплярларды түзүү мүмкүн эмес.

Swiftтен башка тилдерде (мисалы, Java) абстракттуу класс деген түшүнүк — түздөн-түз инстанцияланбай турган класс. Ал ишке ашырылган методдорду (же касиеттерди), ошондой эле абстракттуу методдорду камтыйт, аларды анын подкласстары ишке ашырышы керек.

Swiftте абстракттуу класс концепциясы салттуу мааниде жок. Абстракттуу класс функциялдуулугу протоколдор жана классардын айкалышы аркылуу жеткирилет.

Протоколду колдонуп, интерфейсти аныктап, андан соң ошол протоколго ылайык келген жана ишке ашырган класс түзсө болот. Протоколдун бөлүкчөлүк ишке ашырылышы кеңейтүүлөр (protocol extensions) аркылуу берилсе болот, бирок бул протоколду "абстракттуу класс" кылбайт.

Протокол (Swift) Абстракттуу класс (традициялык)
Максаты Келишимди (интерфейсти) аныктоо Жалпы жүрүм-турум жана структураны бөлүкчөлүк ишке ашыруу менен аныктоо
Ишке ашыруу Көпчүлүк учурда ишке ашырылбайт (кеңейтүүлөрдөн башка) Ишке ашырылган жана абстракттуу методдорду камтышы мүмкүн
Инстанциялоо Протоколдун экземплярын түзүү мүмкүн эмес Түздөн-түз абстракттуу класс экземплярын түзүү мүмкүн эмес
Мурас Протоколго ылайык келүү (conformance) Мурас (inheritance)
Көп мурас Тип көп протоколдорго ылайык келиши мүмкүн Класс бир гана классдан мурас алат (көптөгөн тилдерде)
Swiftте Негизги абстракция формасы Түз эквивалент жок, протоколдор жана класс аркылуу имитацияланат

Swiftте протоколдорду колдонуп, абстракттуу класс сыяктуу ишке ашыруу мисалы:

Абстракттык талаптарды аныктоочу протокол:

// Протокол, келишим катары
protocol Drawable {
    func draw()
    var color: String { get set }
}

Протоколго ылайык келген жана ишке ашырган класс:

// Протоколду ишке ашыруу классы
class Circle: Drawable {
    var color: String

    init(color: String) {
        self.color = color
    }

    func draw() {
        print("Төйүлдүн түсү \(color) менен сүрөттөө")
    }
}

Өз алдынча ишке ашыруу үчүн кеңейтүү:

// Протоколду ишке ашыруу боюнча алдын ала ишке ашыруу берүү үчүн кеңейтүү (протоколду абстракттуу класс кылбайт)
extension Drawable {
    func draw() {
        print("Айрым бир нерсени сүрөттөө башталды \(color)")
    }
}

Ошентип, Swiftте протоколдор полиморфизм жана абстракцияны ишке ашырууда негизги роль ойнойт, башка тилдердин абстракттуу класс концепцияларын алмаштырып турат.