Permalink
Browse files

Update interfaces.md

  • Loading branch information...
Temon137 committed Jun 19, 2017
1 parent 00c981e commit c815ad50f794914335f91e3eebf846596935fa61
Showing with 4 additions and 4 deletions.
  1. +4 −4 interfaces.md
View
@@ -15,7 +15,7 @@ properties but these need to be abstract or to provide accessor implementations.
Интерфейсы в <b>Kotlin</b> очень похожи на интерфейсы в <b>Java 8</b>. Они могут содержать абстрактные методы, методы с реализацией. Главное отличие интерфейсов от абстрактных классов заключается в невозможности хранения переменных экземпляров. Они могут иметь свойства, но те должны быть либо абстрактными, либо предоставлять реализацию методов доступа.
<!--An interface is defined using the keyword *interface*{: .keyword }-->
Интерфейс определяется ключевым словом **interface**
Интерфейс определяется ключевым словом **interface**:
``` kotlin
interface MyInterface {
@@ -30,7 +30,7 @@ interface MyInterface {
## Реализация интерфейсов
<!--A class or object can implement one or more interfaces-->
Класс или объект могут реализовать любое количество
Класс или объект могут реализовать любое количество интерфейсов:
``` kotlin
class Child : MyInterface {
@@ -69,7 +69,7 @@ class Child : MyInterface {
## Устранение противоречий при переопределении
<!--When we declare many types in our supertype list, it may appear that we inherit more than one implementation of the same method. For example-->
Когда мы объявлем большое количество типов в списке нашего супертипа, может так выйти, что мы допустим более одной реализации одного и того же метода. К примеру
Когда мы объявлем большое количество типов в списке нашего супертипа, может так выйти, что мы допустим более одной реализации одного и того же метода. Например:
``` kotlin
interface A {
@@ -99,4 +99,4 @@ because this is the default for interfaces, if the function has no body). Now, i
an implementation. And if we derive *D* from *A* and *B*, we don’t have to override *bar()*, because we have inherited only one implementation of it.
But we have inherited two implementations of *foo()*, so the compiler does not know which one to choose, and forces us to override *foo()* and say what we want explicitly.-->
Оба интерфейса *A* и *B* объявляют функции *foo()* и *bar()*. Оба реализуют *foo()*, но только *B* содержит реализацию *bar()*
(*bar()* не отмечен, как абстрактный метод в интерфейсе *A* потому, что в интерфейсах это подразумевается по умолчанию, если у функции нет тела). Теперь, если мы унаследуем какой-нибудь класс *C* от *A*, нам, очевидно, придётся переопределять *bar()* обеспечивать его реализацию. А если мы унаследуем *D* от *A* и *B*, нам не надо будет переопределять *bar()*, потому что мы унаследовали только одну его имплементацию. Но мы получили в наследство две имплементации *foo()*, поэтому компилятору не известно, какую выбрать. Он заставит нас переопределить функцию *foo()* и явно указать что мы имели в виду.
(*bar()* не отмечен как абстрактный метод в интерфейсе *A*, потому что в интерфейсах это подразумевается по умолчанию, если у функции нет тела). Теперь, если мы унаследуем какой-нибудь класс *C* от *A*, нам, очевидно, придётся переопределять *bar()*, обеспечивать его реализацию. А если мы унаследуем *D* от *A* и *B*, нам не надо будет переопределять *bar()*, потому что мы унаследовали только одну его имплементацию. Но мы получили в наследство две имплементации *foo()*, поэтому компилятору не известно, какую выбрать. Он заставит нас переопределить функцию *foo()* и явно указать что мы имели ввиду.

0 comments on commit c815ad5

Please sign in to comment.