Фарқияти байни протоколҳо ва синфҳо вақте ки сухан дар бораи синфҳои абстрактӣ меравад?
sobes.tech AI
Ҷавоб аз AI
Протокол муайян мекунад шарт — маҷмӯи талаботҳо (усулҳо, хосиятҳо, оғозкунандагон), ки бояд намуде, ки ба ин протокол мувофиқат мекунад, иҷро кунад. Протоколҳо иҷрои аксар талаботҳои худро надоранд. Имконнопазир аст, ки намунаи протоколро эҷод кард.
Класи абстрактӣ дар забонҳое, ки аз Swift фарқ мекунанд (масалан, Java), маънои класиеро дорад, ки мустақиман намешавад онро эҷод кард. Он дорои усулҳои иҷрошуда (ё хосиятҳо), ва инчунин усулҳои абстрактӣ мебошад, ки бояд дар зеркласиҳои он иҷро шаванд.
Дар Swift, мафҳуми класи абстрактӣ дар маънои анъанавӣ вуҷуд надорад. Функсионалият дар 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, протоколҳо нақши калидӣ дар расидан ба полиморфизм ва абстраксия мебозанд, ҷойгузинии мафҳуми класи абстрактӣ аз дигар забонҳо.