DevPrep

Все темы › Объектно-ориентированное программирование (ООП)

Чем абстрактный класс отличается от интерфейса?

Junior

Суть

Абстрактный класс — класс, экземпляр которого нельзя создать: часть методов объявлена без тела, часть реализована, есть хранимые поля и конструкторы. Интерфейс — чистый контракт без состояния; тип может реализовать несколько интерфейсов, но наследовать только один класс.

Классическое различие (Java/C#):

Старый ответ «интерфейс содержит только объявления и не может иметь свойств» устарел.

В Swift абстрактных классов нет

Ключевое слово abstract отсутствует. Варианты:

import Foundation

// 1. Protocol with a default implementation — the Swift way.
protocol Exporter {
    var fileExtension: String { get }      // "abstract" member
    func serialize(_ text: String) -> Data
}
extension Exporter {
    func export(_ text: String) -> String {   // shared "concrete" method
        "report.\(fileExtension) (\(serialize(text).count) bytes)"
    }
}
struct TextExporter: Exporter {
    let fileExtension = "txt"
    func serialize(_ text: String) -> Data { Data(text.utf8) }
}
print(TextExporter().export("hi"))   // report.txt (2 bytes)

// 2. Emulated abstract class: crashes at runtime instead of compile time.
class AbstractExporter {
    func serialize(_ text: String) -> Data {
        fatalError("subclass must override")
    }
}

На что смотрит интервьюер

Потренируйтесь перед собеседованием

В DevPrep эти ответы превращаются в задачи на минуту: что напечатает код, найди баг, пробное собеседование. По задаче в день.

Скачать DevPrep в App Store