2014-09-04 5 views
1

У меня есть метод в моих чертахкак заставить метод быть реализован в конкретном подклассе от признака

def controller: AnyRef 

но мой конкретный класс не реализует этот метод, и он по-прежнему компиляции. Компилятор не позволяет мне добавлять абстрактные данные в этот метод. Как я могу создать метод в признаке, который заставляет его реализовать его реализовать?

спасибо, Дин

+0

Является ли класс расширением абстрактного признака? –

+0

да, и я понял это. в конкретном подклассе был контроллер val = new Controller, и, когда это происходит, по какой-то причине вызывающий контроллер в методе trait заканчивает возврат null. Я добавил истинный ответ ниже (но тогда у вас есть новый вопрос, почему он компилируется) –

ответ

5

Компилятор навязывает, что конкретные классы реализуют все методы тезисов они наследуют от суперкласса и черт.

Если ваш класс компилировался, это означало, что он не был конкретным, то есть был trait или abstract class, и вы не можете заставить ни реализовывать абстрактный метод.

Конечно, как только вы попытаетесь получить конкретный экземпляр, компилятор вызовет ошибку, поскольку метод не реализован.

Практический пример в РЕПЛ

scala> trait A { def controller: AnyRef } 
defined trait A 

scala> trait B extends A 
defined trait B 

scala> abstract class C extends A 
defined class C 

scala> class D extends A 
<console>:8: error: class D needs to be abstract, since method controller in trait A of type => AnyRef is not defined 
     class D extends A 

scala> new B { } 
<console>:10: error: object creation impossible, since method controller in trait A of type => AnyRef is not defined 
       new B { } 
       ^

scala> new C 
<console>:10: error: class C is abstract; cannot be instantiated 
       new C 
+0

ах, я мог бы поклясться, что у меня была такая компиляция с абстрактным методом и запущена, и она вернула null в моем случае, но по какой-то причине сегодня я не могу воспроизвести это :( –

+0

Теперь я могу воспроизвести его. В конкретном подклассе был контроллер val = новый TheController(), и в этом случае признак заканчивается возвратом null, когда вы вызываете контроллер в этом случае. Это похоже на ошибку scala или что-то. –

+0

это, вероятно, порядок инициализации. Вы должны открыть новый вопрос для этой конкретной проблемы, с минимальным воспроизводимым примером –

1

Если вы не получаете ошибку компиляции для такого случая, я думаю, что ваш IDE имеет некоторые проблемы, попробуйте обновить/очистить свой проект.

Если ваша черта имеет реализацию функции «контроллер», то конкретный класс (не абстрактный класс), требующий расширения, должен , а не, имеет любую реализацию для функции «контроллер». Это красота черты в Scala, не заставляя весь конкретный класс реализовать некоторые распространенные методы с одинаковой реализацией.

+0

получается, если у вас есть конкретный подкласс с контроллером val = новый контроллер, он компилируется !!! и хуже , он возвращает null вместо контроллера. –

0

ну, похоже, какой-то странный вопрос scala происходит.

Если у вас есть конкретный подкласс, который имеет

val controller = new Controller 

это, кажется, влияет на контроллер черт и имеющую свои результаты контроллера черт реальных вызовов в нуле возвращаются. Все компилируется просто отлично (хотя я думаю, что это может быть ошибка scala, поскольку я не думаю, что это должно скомпилировать).

Если он должен компилироваться, тогда кто-то может объяснить, почему он компилируется.