2016-10-25 4 views
6

У меня есть черта, которая расширяет две другие черты, имеющие одно и то же имя для функции, но немного отличающуюся от внутренней, я хочу знать, как узнать, какая функция будет вызвана ?Наследование одного и того же имени из отличительных признаков

я черта B что имеет print() и признак C что имеет print(), если я наследовать оба так:

trait A extends B with C { 
    def print() 
} 

каждый отпечаток печати что-то еще, что печать будет вызываться?

ответ

6

В случае, когда у вас возникли конфликты имен, вы получите ошибку времени компиляции. Предполагая, что D является класс реализации:

class D extends A with C with B 

def main(args: Array[String]): Unit = { 
    val d = new D 
    println(d.print()) 
} 

Вы увидите:

Error:(25, 9) class D inherits conflicting members: 
    method print in trait B of type()Unit and 
    method print in trait C of type()Unit 
(Note: this can be resolved by declaring an override in class D.) 
    class D extends A with B with C 

Однако, если мы помочь компилятору путем добавления override print() к D, и сделать его называют super.print(), он будет печатать последняя черта в построчной оплате, которая поддерживает print метод, то есть:

trait A { } 

trait B { def print() = println("hello") } 

trait C { def print() = println("world") } 

class D extends A with B with C { 
    override def print(): Unit = super.print() 
} 

Мы получили бы «мир» , Если мы перешли B и C:

class D extends A with C with B { 
    override def print(): Unit = super.print() 
} 

Мы получили бы "привет".

+1

Я бы добавил, что вы можете быть явным: 'class D расширяет A с B с помощью C {переопределить def print(): Unit = super [B] .print()} '. –

0

Scala компилятор дает вам ошибку компиляции.

Почему вы не видите это самостоятельно, используя Scala REPL.

scala> trait B { def print(): Unit = println("B") } 
defined trait B 

scala> trait C { def print(): Unit = println("C") } 
defined trait C 

scala> trait A extends B with C { def foo = print() } 
cmd11.sc:1: trait A inherits conflicting members: 
    method print in trait B of type()Unit and 
    method print in trait C of type()Unit 
(Note: this can be resolved by declaring an override in trait A.) 
trait A extends B with C { def foo = print() } 
    ^
Compilation Failed 

Я думаю, что вы можете легко понять, используя ошибку компилятора

1

Одним из наиболее важных особенностей Признаков в оригинальной Schärli, Дюкассах Nierstrasz, черная бумага является разрешением конфликтов с помощью переименования и скрытия. Эта особенность полностью отсутствует в свойствах Scala.

В Scala конфликты просто не допускаются. Они распознаются и отклоняются системой типов. (Исходная статья была в контексте Smalltalk, которая не имеет системы типов, поэтому использовался другой подход.)

Смежные вопросы