Как вы знаете, интерфейсы — это всего лишь абстрактные функции, но с небольшими отличиями.
Аннотация означает две вещи:
- этот класс не может быть создан
- этот класс может иметь поля без реализации (абстрактные поля, такие как абстрактные функции или абстрактные свойства)
Теперь поговорим об отличиях:
- Обычный класс может наследоваться только от одного абстрактного класса, но может реализовывать любое количество интерфейсов.
- интерфейсы не могут управлять состоянием, поскольку они не могут иметь конкретных свойств, подобных этому:
interface Thing {
val thing = 1 // error Property initializers are not allowed in interfaces
}
но это действительно в абстрактных классах
abstract class Thing {
val thing = 1
3. интерфейсы не могут иметь защищенные функции, а абстрактные могут
protected : это модификатор доступа означает, что доступ к полям возможен только в их подклассах.
так что это недействительно
interface something{
protected fun something() = "thing" // error Modifier 'protected' is not applicable inside 'interface'
}
но это действительно
abstract class something{
protected fun something() = "thing"
}
4. Интерфейсы могут наследовать от других интерфейсов, используя ту же нотацию, что и для наследования с классами:
interface Base {
fun foo()
}
interface Sub : Base {
fun goo() {
// do something
} }
Однако интерфейс не может пометить унаследованный абстрактный метод как окончательный, даже если он предоставляет реализацию. Итак, это нормально:
interface Base {
fun foo()
}
interface Sub : Base {
override fun foo() {
// this supplies an implementation
} }
но это неверно:
interface Base {
fun foo()
}
interface Sub : Base {
override final fun foo() {
// this supplies an implementation
//error: modifier 'final' is not applicable inside 'interface'
override final fun foo() {
} }
Абстрактные классы, как и обычные классы, могут переопределять унаследованные методы и объявлять эти переопределенные методы как окончательные, чтобы предотвратить их переопределение другими подклассами.
Спасибо …