Бесшовное плетение черты - PullRequest
1 голос
/ 28 февраля 2011

Я хотел бы автоматически связать определение новой функции say, введенной расширяющей чертой Ext, в абстрактный класс A:

class Base {
    abstract class A
    class B extends A
    case class C extends A   
}

trait Ext extends Base {
    trait A extends super.A {
        def say = "hello"
    }
}

object Test extends Base with Ext {
    val b = new B
    b.say
}

Однако я получаю следующую ошибку:

<console>:12: error: value say is not a member of Test.B
           b.say

Есть ли способ сделать это?

Ответы [ 2 ]

2 голосов
/ 28 февраля 2011

Кажется, вы пытаетесь использовать виртуальные классы, а эта функция недоступна в Scala.

Как только A и B определены, они не могут быть переопределены (как переопределение метода).

abstract class A
class B extends A

С другой стороны, учитывая ваш пример, ваша цель может быть достигнута простым миксином. Вот это с несколькими переписывает:

class Base {
    abstract class A
    class B extends A
    case class C extends A   
}

trait Ext extends Base {
    trait CanSay extends A {
        def say = "hello"
    }
}

object Test extends Base with Ext {
    val b = new B with CanSay
    def apply = b.say
}

Test.apply

Не уверен, что это действительно поможет, но по крайней мере поможет вам понять, что происходит.

0 голосов
/ 28 февраля 2011

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

Рассмотрим класс Hierarchy в этой ситуации.На базе у нас есть A, который затем разделяется на BBase) и Ext.A.Они не связаны, за исключением их общего супертипа, поэтому вы никогда не найдете метод say в экземпляре B.

Возможно, путаница возникает из-за использования слова abstract.Модификатор абстрактного класса (даже внутреннего класса) не делает его абстрактным членом родительского класса, но обозначает, что он сам может иметь абстрактные члены.Есть способы дать классу абстрактный член класса - через параметры типа или члены типа.К сожалению, вы не можете получить эти AFAIK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...